为什么要省略关闭标记?

2022-08-30 05:55:08

我一直在阅读在文件末尾使用PHP关闭标记是一种糟糕的做法。标头问题在以下上下文中似乎无关紧要(这是迄今为止唯一好的论据):?>

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

每本好的练习书和维基都以这个“规则”开始,但没有人提供充分的理由。有没有另一个很好的理由跳过结束的PHP标签?


答案 1

早于正常过程发送标头可能会产生深远的影响。以下是目前碰巧想到的几个:

  1. 虽然当前的 PHP 版本可能具有输出缓冲,但您将在其上部署代码的实际生产服务器远比任何开发或测试计算机都重要。而且他们并不总是倾向于立即跟随最新的PHP趋势。

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

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

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

  5. 最后,许多PHP框架,包括SymfonyZend和Laravel(在编码指南中没有提到这一点,但它遵循了这种情况)和PSR-2标准(项目2.2)需要省略结束标记。PHP手册本身(12),WordpressDrupal和许多其他PHP软件我猜,建议这样做。如果您只是养成了遵循标准的习惯(并为您的代码设置PHP-CS-Fixer),那么您可以忘记这个问题。否则,您将始终需要将问题牢记在心。

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

  1. 甚至一些众所周知的库也可能在 之后包含多余的行尾。一个例子是Smarty,即使是2.*和3.*分支的最新版本也有这个。因此,与往常一样,请留意第三方代码。奖金奖励:用于删除不必要的PHP结尾的正则表达式:在包含PHP代码的所有文件中替换为空文本。?>(\s*\?>\s*)$

答案 2

你应该省略php结束标记()的原因是,程序员不会意外地发送额外的换行符。?>

你不应该省略php结束标签的原因是因为它会导致php标签的不平衡,任何有半个头脑的程序员都可以记住不要添加额外的空格。

所以对于你的问题:

有没有另一个很好的理由跳过结束的php标签?

不,没有另一个很好的理由跳过结束的php标签。

最后,我将提出一些不打扰结束标记的论据:

  1. 人们总是能够犯错误,无论他们多么聪明。坚持减少可能错误数量的做法(恕我直言)是一个好主意。

  2. PHP 不是 XML。PHP不需要遵守XML严格的标准就可以很好地编写和功能。如果缺少的结束标记惹恼了您,则可以使用结束标记,这不是一成不变的规则。


推荐