我遇到了一个代码库,其中PHP文件以<?php开头,但不以?>结尾?
我没有看到任何关于原因的文档,但显然这与" security"有关。
有人可以告诉我为什么我会打破常识并省略文件底部的结束PHP标记吗?
答案 0 :(得分:2)
如果文件是纯PHP代码,则最好省略文件末尾的PHP结束标记。这可以防止在PHP结束标记之后添加意外的空格或新行,这可能会导致不必要的影响,因为当程序员无意在脚本中发送任何输出时,PHP将启动输出缓冲。
它与“安全”无关。它与函数有关,其行为取决于输出是否已经发送到客户端。最好的例子是函数header()
。它用于操作HTTP响应头。在发送任何输出之前,此函数仅在中起作用 - 如在HTTP中,标题无法在正文后发送。
让我们回到PHP的本质。它是一种脚本语言,可以嵌入到其他文档中,如HTML:
<html>
<head><title><?php echo $title; ?></title></head>
<body><?php echo $body; ?></body>
</html>
当嵌入到其他文档中时,PHP的输出将被插入到文档中,原始文档保持原样,这意味着只是将其文字内容发送给客户端。
当您有一个类文件时,例如:
<?php
class Foo {
}
?><whitespace>...
<newline>
<newline>
...您正在关闭PHP标记,文件中有两个被遗忘的空格和新行。 PHP会将这些空格和新行发送到客户端,这意味着像header()
这样的函数将不再起作用。这只是一个嵌入了PHP代码的文本文档。 (与其他语言的源代码文件不同)。 PHP将替换<?php ?>
之间的部分,并将结果+文件的剩余部分发送给客户端。
如果在这种情况下省略了结束PHP标记,PHP解析器将忽略空格和换行符,因为它们不包含代码。
答案 1 :(得分:0)
根据php.net的原因,避免结束php标签的原因是:
“如果文件是纯PHP代码,最好省略文件末尾的PHP结束标记。这可以防止在PHP结束标记之后添加意外的空格或新行,这可能会导致不良影响,因为PHP当程序员无意在脚本中发送任何输出时,将启动输出缓冲。“