一尘不染

为什么有人会省略关闭标签?

php

我一直在阅读?>,在文件末尾使用PHP close标签是一种不好的做法。标头问题在以下情况下似乎无关紧要(这是迄今为止唯一的好参数):

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

每本优秀实践书籍和Wiki均以该“规则”开头,但没有人提供充分的理由。 是否还有另一个很好的理由跳过结尾的PHP标记?


阅读 352

收藏
2020-05-26

共1个答案

一尘不染

提前发送标头可能会产生深远的影响。以下是我眼中突然想到的其中一些:

  1. 尽管当前的PHP版本可能会缓冲输出,但是将要用于部署代码的实际 生产服务器 比任何开发或测试机器都重要得多。而且他们并不总是倾向于立即跟随最新的PHP趋势。

  2. 您可能会为莫名其妙的 功能丧失 感到头痛。假设您正在实现某种付款网关,并在付款处理器成功确认后将用户重定向到特定的URL。如果发生某种PHP错误,甚至是警告或行末多余,付款可能仍未处理,并且用户似乎仍未开票。这也是不必要的重定向是邪恶的原因之一,如果要使用重定向,则必须谨慎使用。

  3. 即使在最新版本中,您也可能在Internet Explorer中收到“页面加载已取消”类型的错误。这是因为 AJAX 响应/ json包含不应该包含的内容,因为某些PHP文件中的行尾多余,就像我几天前遇到的那样。

  4. 如果您的应用程序中有一些 文件下载 ,它们也可能因此中断。而且即使多年后,您也可能不会注意到它,因为下载的特定习惯取决于服务器,浏览器,文件的类型和内容(以及其他一些我不想让您感到厌烦的因素) 。

  5. 最后,许多PHP框架,包括Symfony,[Zend和Laravel(在编码指南中没有提及,但遵循了诉讼)和PSR-2标准项目2.2)要求省略结束标记。PHP手册本身1,2,WordPress的,Drupal的和许多其他PHP软件我想,提醒这样做。如果您只是习惯遵循标准(并为您的代码设置PHP-CS-Fixer),则可以忽略此问题。否则,您将始终需要牢记该问题。

奖励:与这两个字符相关的一些陷阱(实际上是一个陷阱):

  1. 即使是某些知名的库,在之后也可能包含多余的行尾?>。例如Smarty,即使2. 和3. 分支的最新版本也有此功能。因此,一如既往,请 注意第三方代码 。额外的好处:用于删除不必要的PHP结尾的正则表达式:(\s*\?>\s*)$在包含PHP代码的所有文件中替换为空文本。
2020-05-26