php - 为什么会省略close标签?

我一直在读,在文件末尾使用php close标记是很糟糕的做法。在以下上下文中,头部问题似乎无关紧要(这是迄今为止唯一一个好的论点):
PHP的现代版本在php.ini中设置了输出缓冲标志
如果启用了输出缓冲,则可以在输出HTML后设置HTTP头和cookie,因为返回的代码不会立即发送到浏览器。
每一本好的实践书和wiki都是从这个“规则”开始的,但是没有人给出好的理由。
是否还有另一个跳过结束PHP标记的好理由?


最佳答案:

在正常进程之前发送头文件可能会产生深远的影响。以下是我当时想到的几个问题:
虽然当前的PHP版本可能有输出缓冲功能,但是将在其上部署代码的实际生产服务器比任何开发或测试机器都要重要得多。而且它们并不总是紧跟最新的PHP趋势。
您可能会因为无法解释的功能丧失而头痛。例如,您正在实现某种支付网关,并在支付处理器成功确认后将用户重定向到特定的URL。如果发生某种类型的PHP错误,甚至是警告,或者出现了多余的行尾,那么付款可能仍然没有处理,并且用户似乎仍然可以取消绑定。这也是不必要重定向是邪恶的原因之一,如果要使用重定向,则必须小心使用。
即使在最新版本中,Internet Explorer中也可能出现“页面加载已取消”类型的错误。这是因为ajax响应/json包含一些它不应该包含的内容,因为在一些PHP文件中有多余的行尾,就像我几天前遇到的那样。
如果你的应用程序中有一些文件下载,它们也会因此中断。而且你可能不会注意到,即使多年后,因为下载的具体破坏习惯取决于服务器、浏览器、文件的类型和内容(可能还有其他一些我不想让你厌烦的因素)。
最后,许多PHP框架(包括SymfonyZend和laravel)(在coding guidelines中没有提到这一点,但它符合要求)和PSR-2 standard(项2.2)需要省略结束标记。PHP手册本身(12)、WordpressDrupal和许多其他的PHP软件,我想,建议这样做。如果你只是养成了遵循标准的习惯(并且为你的代码设置了PHP-CS-Fixer),你就可以忘记这个问题。否则,你将永远需要记住这个问题。
奖励:与这两个字符相关的几个gotchas(实际上是一个):
即使是一些著名的库也可能在?>之后包含多余的行尾。一个例子是smarty,即使是2.*和3.*分支的最新版本也有这个例子。所以,和往常一样,注意第三方代码。额外的好处:一个用于删除不必要的php结尾的regex:replace(\s*\?>\s*)$with empty text in all files that contain php code.