PHP 结束标记“?>”

2022-08-30 12:25:23

我有一个有趣的现象与PHP结束标签。我有一个由Ajax调用执行的php文件。在php文件中包含一个具有各种函数的php库文件。当包含此库时,php 响应包含一堆空行。当我从库中删除结束标记时,这种情况停止了。任何人都可以向我解释这里发生了什么吗?


答案 1

这是有据可查的。来自 PHP 手册

文件末尾的 PHP 块的结束标记是可选的,在某些情况下,在使用 include() 或 require() 时省略它很有用,因此不需要的空格不会出现在文件末尾,您仍然可以在以后的响应中添加标头。如果您使用输出缓冲,并且不希望在包含的文件生成的部分的末尾看到添加不需要的空格,这也很方便。

省略结束标记有助于防止意外的空格或换行符被添加到文件末尾。


答案 2

这是一个核心的PHP功能:与其他语言不同,你需要用一个特殊的标签(通常)标记PHP代码,因为其他所有内容都被认为是文字输出:<?php

This is not PHP
<?php

echo 'This is PHP' . PHP_EOL;

?>
This is not PHP either
D:\tmp>php test.php
This is not PHP
This is PHP
This is not PHP either

虽然手册提到了HTML,但PHP并不真正知道/关心其标签之外的内容类型是什么。

如果你在进一步的东西之后忘记关闭一个PHP块,你通常会得到一个语法错误:

This is not PHP
<?php

echo 'This is PHP' . PHP_EOL;

This is not PHP either
D:\tmp>php test.php
PHP Parse error:  syntax error, unexpected 'is' (T_STRING) in D:\tmp\borrame.php on line 6

空行是一种特殊情况,因为它们在几乎所有语言(PHP,HTML,CSS,JavaScript......)中都是有效的,几乎看不见,所以它们经常被忽视。

删除标记后,文本空白行将从脚本输出中消失,因为它们已成为PHP代码的一部分(因此,它们已经开始被忽略)。?>

当然,PHP忽略了空行,但不一定被你正在生成的任何东西所忽略,正如我所说,它不需要是HTML:它可以是图片,PDF文档,Excel电子表格。伪造的白线可以很容易地避免,因为它不关闭最后一个PHP块,因为它是文件的最后一部分。


推荐