我一直在读,在文件末尾使用PHP关闭标记?>是不好的做法。在下面的上下文中,头文件的问题似乎无关紧要(这是目前为止唯一一个好的参数):

现代版本的PHP在PHP .ini中设置了output_buffering标志 如果启用了输出缓冲,则可以在输出HTML后设置HTTP报头和cookie,因为返回的代码不会立即发送到浏览器。

每一本好的实践书籍和维基都以这个“规则”开始,但没有人提供好的理由。 还有其他好的理由跳过PHP结束标记吗?


当前回答

“是否有其他好的理由(除了标题问题)跳过结束php标记?”

在生成二进制输出、CSV数据或其他非html输出时,您不希望无意中输出无关的空白字符。

其他回答

嗯,有两种方式来看待它。

PHP代码只不过是一组XML处理指令,因此任何具有. PHP扩展名的文件都只不过是一个恰好被解析为PHP代码的XML文件。 PHP恰好为它的打开和关闭标记共享XML处理指令格式。基于此,扩展名为.php的文件可能是有效的XML文件,但它们不一定是。

如果您相信第一种方法,那么所有PHP文件都需要结束标记。省略它们将创建一个无效的XML文件。然后,没有开口<?xml version="1.0" charset="latin-1" ?>声明,你将不会有一个有效的xml文件…所以这不是一个大问题……

如果你相信第二种方法,那么就会出现两种类型的.php文件:

只包含代码的文件(例如库文件) 包含原生XML和代码的文件(例如模板文件)

基于此,只有代码的文件可以在没有?>结束标记的情况下结束。但是XML代码文件不使用?>结束是不合适的,因为它会使XML无效。

但我知道你在想什么。你会想,这有什么关系,你永远不会直接呈现PHP文件,所以谁会关心它是否是有效的XML。如果您正在设计一个模板,那么这确实很重要。如果它是有效的XML/HTML,普通浏览器将不会显示PHP代码(它被视为注释)。所以你可以模拟出模板,而不需要运行PHP代码…

我不是说这很重要。这只是一个我不经常看到的观点,所以还有什么更好的地方来分享它呢?

就我个人而言,我不关闭库文件中的标签,但在模板文件中这样做…我认为这是基于个人喜好(和编码指南)的。

这不是标签……

但如果你有了它,你就有可能在它后面留下空白。

如果你把它作为一个包含在文档的顶部,你可能会在你试图发送HTTP头之前插入空白(即内容),这是不允许的。

如果我正确理解这个问题,它与输出缓冲以及这可能对结束/结束标记的影响有关。我不确定这是一个完全合理的问题。问题是输出缓冲区并不意味着所有内容在发送到客户机之前都保存在内存中。意思是有些内容是。

程序员可以故意刷新缓冲区或输出缓冲区那么PHP中的输出缓冲区选项真的会改变结束标记对编码的影响吗?我认为不是这样的。

也许这就是为什么大多数答案都回到了个人风格和语法。

“是否有其他好的理由(除了标题问题)跳过结束php标记?”

在生成二进制输出、CSV数据或其他非html输出时,您不希望无意中输出无关的空白字符。

根据文档,如果关闭标记位于文件末尾,出于以下原因,最好省略它:

如果文件是纯PHP代码,最好省略文件末尾的PHP结束标记。这可以防止在PHP结束标记之后意外地添加空白或新行,这可能会导致不必要的影响,因为当程序员在脚本中不打算发送任何输出时,PHP将启动输出缓冲。

PHP手册>语言参考>基本语法> PHP标签