我一直在读,在文件末尾使用PHP关闭标记?>是不好的做法。在下面的上下文中,头文件的问题似乎无关紧要(这是目前为止唯一一个好的参数):
现代版本的PHP在PHP .ini中设置了output_buffering标志 如果启用了输出缓冲,则可以在输出HTML后设置HTTP报头和cookie,因为返回的代码不会立即发送到浏览器。
每一本好的实践书籍和维基都以这个“规则”开始,但没有人提供好的理由。 还有其他好的理由跳过PHP结束标记吗?
我一直在读,在文件末尾使用PHP关闭标记?>是不好的做法。在下面的上下文中,头文件的问题似乎无关紧要(这是目前为止唯一一个好的参数):
现代版本的PHP在PHP .ini中设置了output_buffering标志 如果启用了输出缓冲,则可以在输出HTML后设置HTTP报头和cookie,因为返回的代码不会立即发送到浏览器。
每一本好的实践书籍和维基都以这个“规则”开始,但没有人提供好的理由。 还有其他好的理由跳过PHP结束标记吗?
当前回答
由于我的问题被标记为这个问题的重复,我认为可以发布为什么不省略结束标签?>可能是出于某些原因。
具有完整的处理指令语法(<?php……?>) PHP源代码是有效的SGML文档,可以用SGML解析器毫无问题地解析和处理。在附加的限制下,它也可以是有效的XML/XHTML。
没有什么可以阻止您编写有效的XML/HTML/SGML代码。PHP文档意识到了这一点。摘录:
注意:还要注意,如果要在XML或XHTML中嵌入PHP,则需要使用< ? PHP ?>标记以保持与标准兼容。
当然,PHP语法不是严格的SGML/XML/HTML,您创建的文档不是SGML/XML/HTML,就像您可以将HTML转换为XHTML以符合XML或不符合XML一样。
At some point you may want to concatenate sources. This will be not as easy as simply doing cat source1.php source2.php if you have inconsistency introduced by omitting closing ?> tags. Without ?> it's harder to tell if document was left in PHP escape mode or PHP ignore mode (PI tag <?php may have been opened or not). Life is easier if you consistently leave your documents in PHP ignore mode. It's just like work with well formatted HTML documents compared to documents with unclosed, badly nested tags etc. It seems that some editors like Dreamweaver may have problems with PI left open [1].
其他回答
如果我正确理解这个问题,它与输出缓冲以及这可能对结束/结束标记的影响有关。我不确定这是一个完全合理的问题。问题是输出缓冲区并不意味着所有内容在发送到客户机之前都保存在内存中。意思是有些内容是。
程序员可以故意刷新缓冲区或输出缓冲区那么PHP中的输出缓冲区选项真的会改变结束标记对编码的影响吗?我认为不是这样的。
也许这就是为什么大多数答案都回到了个人风格和语法。
应该去掉php结束标记(?>)的原因是,这样程序员就不会意外地发送额外的换行字符。
不应该省略php结束标记的原因是它会导致php标记的不平衡,任何稍微有点头脑的程序员都可以记住不要添加额外的空白。
对于你的问题
还有其他好的理由跳过结束php标记吗?
不,没有其他好的理由跳过结束php标记。
我将以不使用结束标签的一些理由来结束:
人们总是会犯错误,不管他们有多聪明。 坚持一种可以减少可能错误数量的做法(恕我直言)是一个好主意。 PHP不是XML。PHP不需要遵循xml的严格标准来编写良好并具有良好的功能。如果一个丢失的结束标签让你烦恼,你可以使用一个结束标签,这不是一个固定不变的规则。
由于我的问题被标记为这个问题的重复,我认为可以发布为什么不省略结束标签?>可能是出于某些原因。
具有完整的处理指令语法(<?php……?>) PHP源代码是有效的SGML文档,可以用SGML解析器毫无问题地解析和处理。在附加的限制下,它也可以是有效的XML/XHTML。
没有什么可以阻止您编写有效的XML/HTML/SGML代码。PHP文档意识到了这一点。摘录:
注意:还要注意,如果要在XML或XHTML中嵌入PHP,则需要使用< ? PHP ?>标记以保持与标准兼容。
当然,PHP语法不是严格的SGML/XML/HTML,您创建的文档不是SGML/XML/HTML,就像您可以将HTML转换为XHTML以符合XML或不符合XML一样。
At some point you may want to concatenate sources. This will be not as easy as simply doing cat source1.php source2.php if you have inconsistency introduced by omitting closing ?> tags. Without ?> it's harder to tell if document was left in PHP escape mode or PHP ignore mode (PI tag <?php may have been opened or not). Life is easier if you consistently leave your documents in PHP ignore mode. It's just like work with well formatted HTML documents compared to documents with unclosed, badly nested tags etc. It seems that some editors like Dreamweaver may have problems with PI left open [1].
不让结束语?>进入是非常有用的。
该文件对PHP是有效的(不是语法错误),正如@David Dorward所说,它允许避免在?>后面有空格/换行符(任何可以向浏览器发送头信息的东西)。
例如,
<?
header("Content-type: image/png");
$img = imagecreatetruecolor ( 10, 10);
imagepng ( $img);
?>
[space here]
[break line here]
无效。
But
<?
header("Content-type: image/png");
$img = imagecreatetruecolor ( 10, 10 );
imagepng ( $img );
会的。
就这一次,为了安全,你必须偷懒。
比正常进程更早地发送头文件可能会产生深远的后果。下面是我当时碰巧想到的其中一些:
While current PHP releases may have output buffering on, the actual production servers you will be deploying your code on are far more important than any development or testing machines. And they do not always tend to follow latest PHP trends immediately. You may have headaches over inexplicable functionality loss. Say, you are implementing some kind payment gateway, and redirect user to a specific URL after successful confirmation by the payment processor. If some kind of PHP error, even a warning, or an excess line ending happens, the payment may remain unprocessed and the user may still seem unbilled. This is also one of the reasons why needless redirection is evil and if redirection is to be used, it must be used with caution. You may get "Page loading canceled" type of errors in Internet Explorer, even in the most recent versions. This is because an AJAX response/json include contains something that it shouldn't contain, because of the excess line endings in some PHP files, just as I've encountered a few days ago. If you have some file downloads in your app, they can break too, because of this. And you may not notice it, even after years, since the specific breaking habit of a download depends on the server, the browser, the type and content of the file (and possibly some other factors I don't want to bore you with). Finally, many PHP frameworks including Symfony, Zend and Laravel (there is no mention of this in the coding guidelines but it follows the suit) and the PSR-2 standard (item 2.2) require omission of the closing tag. PHP manual itself (1,2), Wordpress, Drupal and many other PHP software I guess, advise to do so. If you simply make a habit of following the standard (and setup PHP-CS-Fixer for your code) you can forget the issue. Otherwise you will always need to keep the issue in your mind.
额外的:一些与这两个角色有关的陷阱(实际上目前只有一个):
甚至一些知名的库可能在?>之后包含多余的行尾。一个例子是Smarty,甚至是这两个版本的最新版本。*和3。*分支有这个。因此,与往常一样,要注意第三方代码。额外的奖励:一个用于删除不必要的PHP结尾的正则表达式:在所有包含PHP代码的文件中将(\s*\?>\s*)$替换为空文本。