为什么在PHP 5.4中,“echo”短标签被永久启用?

38
即使官方文档告诉我们 PHP“短标签”(<? /*...*/ ?>)是“不好的”,但自从 PHP 5.4 开始,echo 变体 <?= /*...*/ ?> 已经永久启用,无论 short_open_tag 设置如何。 < p >有什么变化?

即使以前只是因为共享主机平台上是否启用了 short_open_tag 的不可预测性而被反对,但这个论点难道不会因为某些主机子集将运行 PHP 5.4 而消失吗?

可以说,语言的这种变化并不本质上意味着我们仍然应该避免使用“短标签”,但如果他们费心去做这件事,那么 PHP 开发人员肯定不再像以前一样“讨厌”它们了。对吧?

我现在唯一能得出的合乎逻辑的结论就是,必须有一些客观的理由来介绍 PHP 5.4 中的这个变化。

什么是它?

2
如果我正确阅读了http://php.net/manual/en/language.basic-syntax.phpmode.php,那么你的问题并不完全正确——`<?=(short-tag echo)`始终可用,但其他短标签用法则不一定(未经测试)。尽管如此,我也很想知道这种变化的原因。 - John Carter
2
那不是它的意思。它仅表示 <?=,相当于 <?php echo ...?>`,始终可用。 - Cfreak
2
引入短标签配置选项的最初原因是,一些人有将PHP混合到XML文件中的无法抑制的冲动,其中 <?<?xml 冲突。现在发现,大多数人显然用于编辑PHP文件的XML编辑器在遇到 <?= 等时不会退出。 - mario
2
@mario 那很有道理,你有相关的开发者邮件列表讨论或类似的链接吗? - John Carter
1
@therefromhere 不记得在哪里读过了。在Programmers上有类似的话题:http://programmers.stackexchange.com/questions/151661/is-it-bad-practice-to-use-tag-in-php ,而且 <?= 实际上并不是 XML 处理指令 的有效语法,但与短打开标签<?相比被认为冲突较小(可能因为广泛认可)。 - mario
显示剩余4条评论
4个回答

44
自 PHP 5.4 开始,短标签不总是启用的。文档中提到了短输出标记,这是另一种东西。(短打开标签是<?样式的标签,短输出标记是<?=样式的标记,用于输出变量)。
那么为什么现在默认启用它们?有很多脚本可以受益于使用<?= $somevar ?>代替<?php echo $somevar ?>。而且因为短输出标记没有短打开标记那样糟糕,所以选择始终启用短输出标记。现在开发人员(框架和CMS开发者)可以依赖于它们,特别是当PHP 5.4成为主流时。
但是,短打开标记仍然受到php.ini中short_open_tag设置的影响。

3
在所有安装中提供相同的行为是一件好事。我们有越多选项,就需要关注的事情就会越多。这里的问题是,在模板中使用短回声很好,但是短开标签会与 XML 处理指令(例如 <?xml、<?xsl 等)发生冲突,因此我们为可移植代码添加了更高的舒适性…我希望这解释了在这种情况下设计决策的意义。- Johannes(PHP 开发团队成员) - johannes
@johannes:并不是“所有”安装都会受到影响。通过发布新版本,您定义了一个新选项,尽管有最好的意图,但并非每个人都会拥有它(例如:http://xkcd.com/927/)。在功能更改的讨论中,开发团队是否提出了这个问题? - Lightness Races in Orbit
1
好的,我们无法改变过去。不过我们可以尝试为未来做出改进。至少在遗留代码允许的范围内... - johannes
@LightnessRacesinOrbit 这是我在SO上读过的最好的讽刺性评论(我这里并不是在讽刺)。 - Gustavo Rubio
@GustavoRubio:这不是讽刺的。 - Lightness Races in Orbit
显示剩余2条评论

5

只有短的 echo 标签 (<?=) 被永久启用,而不是短开标签 (<?)。这是因为当你创建 HTML 模板(或任何其他视图模板)时,短的 echo 标签非常方便,如果没有它,你就需要写更多的代码(例如 <?php echo $var; ?> 而不是只需写 <?= $var ?>)。


2
原因是在 XML 文档中使用 < ?,启用 short_open_tags 将会在 XML 代码中生成错误。但是,< ?= 就像 < ?php 一样,不是 XML 开始标签,可以安全地使用。

2

注意:从PHP 5.4开始,无论short_open_tag设置如何,短echo标签<?=始终被识别并且有效。

这句话的意思是,<?=始终有效,而不是<?


是的,但问题是_为什么_。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接