我正在编写一个包含由配置文件定义的 template.phtml 文件的应用程序,该函数看起来类似于此:
View.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 文件,则间隙不会出现在输出中。
在任何情况下, View 源的输出看起来完全相同,一个字节接一个字节。
我尝试过的事情:
- 各种 CSS 重置方式。
- 包括
<body>
header.phtml 中的标记(似乎没有解决任何问题...??) - 代码通过html5验证
- 包装
ob_start()
中的包含和ob_end_flush()
- 检查包含的每个文件(在 PHP 中为
using get_included_files()
)以检查是否有任何输出 - 所有文件都正确打开(没有关闭的 PHP 标记)并且在打开前没有恶意空格<?php
文件。
老实说......我想不出是什么导致了这个问题......是 PHP 输出缓冲还是什么?
最佳答案
检查每个 .php 文件。 <?php
之前不能有任何单行.另外,如果你的 php 代码是文件中的最后一件事,那么删除 ?>
.另外,请确保 ?> .. <?php
之间没有空行标记并且 .html
中没有空行文件。
烦人的问题,几年前我遇到过。现在我从不在 php 文件中使用 html,总是输入 <?php
在第一行永远不要输入 ?>
在 .php
的末尾文件和问题消失了:)
关于PHP在顺序包含文件时插入奇怪的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389505/