为什么会忽略关闭标签?
我一直在读这是不良的做法使用PHP结束标记?>
在文件的结尾。 标题问题在以下情况下似乎不相关(迄今为止,这是唯一有效的论据):
现代版本的PHP在php.ini中设置output_buffering标志如果启用了输出缓冲,则可以在输出html之后设置HTTP标头和cookie,因为返回的代码不会立即发送到浏览器。
每本优秀的练习册和wiki都以这条“规则”开始,但没有人提供很好的理由。 是否有另一个很好的理由跳过结尾的PHP标签?
虽然我不记得任何其他原因,但是在正常过程之前发送标题可能会产生深远的影响。 以下是我目前想到的其中几个:
虽然当前的PHP版本可能会有输出缓冲,但您将部署代码的实际生产服务器比任何开发或测试机器都重要得多。 他们并不总是倾向于立即遵循最新的PHP趋势。
您可能会因无法解决的功能丧失而感到头疼。 假设您正在实施某种付款网关,并在付款处理器成功确认后将用户重定向到特定的网址。 如果出现某种PHP错误,甚至发出警告,或发生额外的行结束,付款可能仍未处理,用户可能仍然看不到帐单。 这也是不必要的重定向是邪恶的原因之一,如果要使用重定向,必须谨慎使用。
即使在最新版本中,您可能会在Internet Explorer中看到“页面加载取消”类型的错误。 这是因为AJAX响应/ json包含了一些它不应该包含的内容,因为在某些PHP文件中多余的行结束,就像我前几天遇到的那样。
如果您的应用中有某些文件下载 ,则可能会因此而中断。 即使经过了几年,你也许没有注意到它,因为下载的具体破坏习惯取决于服务器,浏览器,文件的类型和内容(还有其他一些我不想让你担心的因素) 。
最后,包括Symfony,Zend和Laravel在内的许多PHP框架(在编码指南中没有提及这一点,但它遵循了这个套装)和PSR-2标准(第2.2条)要求省略结束标签。 PHP手册本身(1,2),Wordpress,Drupal和许多其他PHP软件,我想,建议这样做。 如果你只是养成遵循标准的习惯(并为你的代码设置PHP-CS-Fixer),你可以忘记这个问题。 否则,您将始终需要将问题留在您的脑海中。
奖金:与这两个字符相关的几个陷阱(实际上是一个):
?>
之后,甚至一些知名图书馆可能会包含多余的行结尾。 一个例子是Smarty,即使是最新版本的2. *和3. *分支都有这个。 因此,一如既往, 留意第三方代码 。 奖金奖金:删除不必要的PHP结尾的正则表达式:在包含PHP代码的所有文件中用空文本替换(s*?>s*)$
。 你应该离开php结束标记( ?>
)的原因是程序员不会不小心发送额外的换行符。
你不应该离开php结束标记的原因是因为它会导致php标记的不平衡,任何半心的程序员都会记住不会添加额外的空白。
所以对于你的问题:
是否有另一个很好的理由跳过结尾的PHP标签?
不,没有其他好的理由可以跳过结尾的php标签。
我将结束一些不打扰结束标记的参数:
无论他们多聪明,人们总是能够犯错误。 坚持减少可能出现错误的做法是(恕我直言)是一个好主意。
PHP不是XML。 PHP不需要严格遵守XML严格的标准,以便编写和运行良好。 如果缺少结束标记会让您感到不适,那么您可以使用结束标记,这不是一种或另一种方式的结石规则。
这是一个新手编码风格建议 ,用心良好,并由手册提供建议。
避开?>
但是只是解决了公用集涓涓细流已经发出原因(原始输出,BOM,通知等)及其后续问题。
PHP实际上包含了一些魔术,可以消除?>
闭包令牌后的单行换行。 虽然有历史问题,并留下新人仍然容易受到片状编辑器和后其他空白unawarely洗牌?>
。
在风格上,一些开发人员更喜欢将<?php
和?>
视为SGML标签/ XML处理指令,这意味着尾部闭合标记的平衡一致性。 (其中btw对于依赖关联类很有用 ,包括取代了低效的逐个文件自动加载。)
开头的<?php
有一点不常见的特征是PHPs shebang(并且每个binfmt_misc完全可行),从而验证相应的关闭标签的冗余性。
传统的PHP语法指南要求?>n
与最近的(PSR-2)同意忽略之间存在明显的建议差异。
(为了记录:Zend框架假设一个在另一个并不意味着其固有的优势。这是一个误解,专家被吸引/目标观众笨重的API)。
供应链管理和现代集成开发环境提供内置解决方案,主要是缓解密切的标签维护。
不鼓励任何使用?>
close标记,只会延迟解释基本的PHP处理行为和语言语义,以避免不经常发生的问题。 由于参与者的熟练程度差异,它仍然适用于协作软件开发。
关闭标签变化
常规的 ?>关闭标签也被称为T_CLOSE_TAG
,或称为“关闭标记”。
它包含一些更多的化身,因为PHP的魔术换行食谱:
?> n (Unix换行符)
?> r (回车,经典MAC)
?> r n (CR / LF,在DOS / Win上)
但是,PHP不支持Unicode组合换行符NEL(U + 0085)。
早期的PHP版本已经IIRC编译插件限制平台不可知论有些(FI甚至只是用来>
接近标记),这是近标签避税的可能历史渊源。
经常被忽视,但在PHP7删除它们之前,常规的<?php
开放标记可以与罕用的</script>
有效地配对为奇数闭合标记 。
“ 硬关闭标签 ”甚至不是一个 - 只是用来比喻这个词。 然而,概念上和使用方面明智的__halt_compiler
应该被识别为关闭标记。
__HALT_COMPILER();
?>
基本上,标记器随后丢弃任何代码或纯HTML部分。 特别PHAR存根使用的是,或其与冗余组合?>
如所描绘。
同样做一个无效的return;
在包含脚本中很少替代,渲染任何?>
尾部空白无效。
然后有各种软/人造密切的标签变化; 鲜为人知并且很少使用,但通常是每个注释掉的令牌:
简单的间距// ? >
// ? >
来逃避PHPs tokenizer的检测。
或者是一个正则表达式可以把握的Unicode代换// ﹖﹥
(U + FE56小问号,U + FE65小角度支架)。
这对PHP没有任何意义,但可以用于PHP不知道或半知晓的外部工具包的实际用途。 想到cat
接合的脚本,结果是// ? > <?php
// ? > <?php
连接,内联保留以前的文件切片。
因此,有一种紧急标签遗漏的紧急标签遗漏依赖于上下文而实际的替代方案。
手动保姆?>
关闭标签不是很现代的任何一种方式。 总是有自动化工具(即使只是sed / awk或regex-oneliners)。 尤其是:
phptags标记整理者
https://fossil.include-once.org/phptags/
通常可用于 - 为第三方代码--unclose
php标签,或者只是修复任何(和所有)实际的空白/ BOM问题:
phptags --warn --whitespace *.php
它还处理 - --long
标签转换等运行时/配置兼容性。