我一直在阅读?>,在文件末尾使用PHP close标签是一种不好的做法。标头问题在以下情况下似乎无关紧要(这是迄今为止唯一的好参数):
?>
现代版本的PHP在php.ini中设置了output_buffering标志。如果启用了输出缓冲,则可以在输出HTML之后设置HTTP标头和cookie,因为返回的代码不会立即发送到浏览器。
每本优秀实践书籍和Wiki均以该“规则”开头,但没有人提供充分的理由。 是否还有另一个很好的理由跳过结尾的PHP标记?
提前发送标头可能会产生深远的影响。以下是我眼中突然想到的其中一些:
尽管当前的PHP版本可能会缓冲输出,但是将要用于部署代码的实际 生产服务器 比任何开发或测试机器都重要得多。而且他们并不总是倾向于立即跟随最新的PHP趋势。
您可能会为莫名其妙的 功能丧失 感到头痛。假设您正在实现某种付款网关,并在付款处理器成功确认后将用户重定向到特定的URL。如果发生某种PHP错误,甚至是警告或行末多余,付款可能仍未处理,并且用户似乎仍未开票。这也是不必要的重定向是邪恶的原因之一,如果要使用重定向,则必须谨慎使用。
即使在最新版本中,您也可能在Internet Explorer中收到“页面加载已取消”类型的错误。这是因为 AJAX 响应/ json包含不应该包含的内容,因为某些PHP文件中的行尾多余,就像我几天前遇到的那样。
如果您的应用程序中有一些 文件下载 ,它们也可能因此中断。而且即使多年后,您也可能不会注意到它,因为下载的特定习惯取决于服务器,浏览器,文件的类型和内容(以及其他一些我不想让您感到厌烦的因素) 。
最后,许多PHP框架,包括Symfony,[Zend和Laravel(在编码指南中没有提及,但遵循了诉讼)和PSR-2标准项目2.2)要求省略结束标记。PHP手册本身1,2,WordPress的,Drupal的和许多其他PHP软件我想,提醒这样做。如果您只是习惯遵循标准(并为您的代码设置PHP-CS-Fixer),则可以忽略此问题。否则,您将始终需要牢记该问题。
奖励:与这两个字符相关的一些陷阱(实际上是一个陷阱):
(\s*\?>\s*)$