【问题标题】:PHP inserting weird space when including files sequentiallyPHP在顺序包含文件时插入奇怪的空间
【发布时间】:2014-12-09 21:50:28
【问题描述】:

我正在编写一个包含由配置文件定义的 template.phtml 文件的应用程序,该函数看起来类似于:

查看.php,View->render()

public function render(){
    $this->addTemplates();
    if($this->vars !== null) extract($this->vars);

    if($this->options['noTemplates'] === False){
        foreach($this->templates['before'] as $fn){
            if(file_exists($fn)){
                include($fn); // <-- This is where templates are included
            } else {
                //error handling
            }
        }
    }

    /* Happens 2 more times in an identical fashion
     * for view files and 'after' templates 
     */

}

我已经用这样简单的文件对其进行了测试:

head.phtml:

<!DOCTYPE html>
<html lang="en">
<head>

</head>
<body>

header.phtml:

<div class="header">
    <div class="container">
        <div class="menu nav">
            <span class="menu-pre"></span>
            <ul>
                <li><a href=""><span>Item 1</span></a></li>
                <li><a href="#"><span>Dropdown</span></a>
                    <ul>
                        <li><a href=""><span>Item 2</span></a></li>
                        <li><a href=""><span>Item 3</span></a></li>
                    </ul>
                </li>
                <li><a href=""><span>Item 4</span></a></li>
            </ul>
            <span class="menu-post"></span>
        </div>
    </div>
</div>
<div class="container">

然后是标准页脚等...

问题来自在某处插入的随机空间,导致页面顶部出现间隙:

在元素检查器中显示以下内容:

我已经在多个浏览器中尝试过,但并不满意,我重置了 CSS,检查器没有显示多余的填充或边距,只是……由于某种原因出现了间隙。

奇怪的是,如果我在 head.phtml 中包含 header.phtml 的内容,即我手动将 header.phtml 的内容放入 head 中。 phtml 文件,则间隙不会出现在输出中。

任何种情况下,来自视图源的输出看起来完全相同相同,逐个字节。

我尝试过的事情:

  • 各种方式的 CSS 重置。
  • 在 header.phtml 中包含 &lt;body&gt; 标记(似乎没有解决任何问题...??)
  • 代码通过html5验证
  • 将包含在 ob_start()ob_end_flush()
  • 检查包含的每个文件(PHP 中的using get_included_files())以检查输出的任何内容 - 所有文件在打开 &lt;?php 文件之前都正确打开(没有关闭 PHP 标记)且没有恶意空格。

老实说...我想不出是什么导致了这个问题...是 PHP 输出缓冲还是什么?

【问题讨论】:

    标签: php css html templates


    【解决方案1】:

    检查每个 .php 文件。 &lt;?php 之前不能有任何单行。此外,如果您的 php 代码是文件中的最后一件事,则删除 ?&gt;。另外,请确保?&gt; .. &lt;?php 标记之间没有空行,.html 文件中也没有空行。

    烦人的问题,我几年前就遇到过。现在我从不在 php 文件中使用 html,总是在第一行输入 &lt;?php,并且从不在 .php 文件的末尾输入 ?&gt;,问题就消失了:)

    【讨论】:

    • 哦,是的,我忘了提,我使用了 PHP 的 get_included_files 并检查了每个(大约 90 个文件)文件 - 它们都没有任何输出(它们都未关闭)。真正的奥秘在于,将第二个包含文件的输出包含在第一个包含文件中可以解决问题,但不能反过来(第二个中的第一个)。
    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2011-08-02
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多