使用PHP短标签是否可接受?

543

以下是官方文档提供的信息

在 PHP 中,有四种不同的开闭标签可以使用。其中两个标签 <?php ?><script language="php"> </script> 总是可用的。另外两个则是短标签和 ASP 风格标签,可以从 php.ini 配置文件中打开或关闭。因此,虽然一些人发现短标签和 ASP 风格标签很方便,但它们不太可移植,通常不建议使用

根据我的经验,大多数服务器确实启用了短标签。输入

<?=

比打字方便得多

<?php echo 

程序员的便利性是一个重要因素,那么为什么他们不被推荐?

63
为了回答“为什么”的问题,我会引用Zend PHP 5认证指南的话:“短标记曾经是PHP世界中的标准;然而,它们的主要缺点是与XML头信息冲突,因此已经逐渐被淘汰了。” - Fluffy
8
在什么情况下会出现这个问题,这是否意味着开发人员使用PHP生成XML很麻烦? - Jon z
10
假设您有一些XML文档希望公开,但又想让这些文档可以被PHP解析,出于某种原因所以您将.xml文件改为可被浏览器解析。您使用了短标签以便开启短代码,但突然间XML头文件解析该XML文档,导致一些问题。曾经令我很抓狂地尝试找到解决方法。自那以后,任何我管理的服务器都已禁用短代码,并且我与之合作的任何团队也只能使用非短代码。 - thenetimp
45
从 PHP 5.4.0 开始,short_open_tag 指令不包括短的 echo 标签 **<?= $example;?>**!这非常重要,因为使用其他所有短标记都被视为徒劳。无论如何,从现在开始鼓励使用短的 echo 标签,它可以提供更平滑和整洁的代码基础 - 特别是在视图文件中。所以在 PHP >= 5.4.0 中可以使用 <?= ?> 而不需要设置 short_open_tag。请不要在您的代码中使用其他短标记,否则代码之神会非常生气... - Borislav Sabev
6
因为已经有太多长篇回答了,我想添加一个简短的评论:<? 不仅用于 XML 中的 <?xml version="1.0" ?> 声明,它是“处理指令”的通用语法,第二个最常见的示例是 <?xml-stylesheet ... ?>。实际上,<?php 可以被视为有效的处理指令,<?=(在5.4+中允许)也可以,但是将整个 <? 视为处理指令会在语法之间创建不必要的冲突。 - IMSoP
显示剩余7条评论
28个回答

389

必须清楚区分PHP短标签(<?)和缩写的echo标签(<?=)。

前者被PHP编码标准禁止使用,主要基于常识因为如果您需要将代码移动到不支持它的服务器上(并且您无法启用它),那会很麻烦。就像您所说,很多共享主机支持短标签,但并非全部。如果您想分享脚本,最好使用完整语法。

而缩写的echo标签<?=不能被禁用,因此完全可以使用。

我同意<?对程序员来说比<?php更容易,但只要每次使用相同的形式进行批量查找和替换就可以解决这个问题。

我不认为可读性是一个合理的理由。大多数严肃的开发人员都有语法高亮选项可供选择。

正如ThiefMaster在评论中提到的,从PHP 5.4开始,<?= ... ?>标签在任何地方都被支持,无论短标签设置如何。这应该意味着它们可以安全地用于可移植的代码,但这也意味着它们依赖于PHP 5.4+。如果您想支持5.4之前的版本并且不能保证使用短标签,您仍需要使用<?php echo ... ?>

另外,您需要知道,PHP 7已删除ASP标签 <%,%>,<%=和脚本标签。因此,如果您想支持长期可移植的代码,并且希望切换到最现代化的工具,请考虑更改代码的那些部分。


92
所以,解释是:它们不受支持,所以它们不好吗?但为什么它们没有得到支持?因为它们不是规范的一部分?好的,但是为什么它们不是规范的一部分?对于这个答案我有点失望。 - Josef Sábl
62
我不在这里讨论像我们为什么存在、宇宙是如何开始等“大问题”。共享服务器不能保证支持短代码,并且下一个主要版本将完全删除对其的支持。这就是你需要知道的全部内容。 - Oli
49
短标签不会被淘汰,只有ASP风格的短标签会被淘汰。 - Brian Lacy
13
有些主机不支持 mod_rewrite,还有很多其他选项。不要建议全部使用,纯 HTML 才是王道! - Your Common Sense
46
在即将到来的PHP 5.4版本中,<?=的使用将与短标签(short_open_tags)开启或关闭无关。<?=并没有被逐步淘汰,相反地,它现在被认为是语言的基本组成部分。 - Mr Griever
显示剩余8条评论

178

我喜欢<?=$whatever?>,不想放弃这个东西。从来没有出现过问题。我会一直用着它,直到它让我后悔为止。说真的,在极少数情况下,有85%的客户可以访问php.ini文件以开启它们,另外15%使用主流托管服务提供商,并且几乎所有这些托管服务都已经启用了它们。我很喜欢它们。


41
如果你试图避免每一个理论上可能出现的问题,你的代码几乎肯定会效率低下且存在错误。在 PHP 团队同意逐步淘汰短标签之前(不是 ASP 标签),担心被咬到的风险要小得多,而且潜在的解决方案要比你可以花时间去“修复”的其他问题简单得多。 - SamGoody
18
如果它咬了你,就换一个更好的托管服务。 - Lie Ryan
4
我并不赞同因为某些功能可能不受支持而不使用它。我们难道不应该使用其他一些在服务器上可能不被支持的功能吗?比如MYSQL和MYSQLI?反复写入冗长的标签,仅仅为了避免一点时间去更换更好的主机,这样你会逐渐浪费自己的时间。 - Dean Or
$whatever = "<script>alert('om nom nom');</script>" - user3840170

146

19
我认为这是唯一需要的“短标记”。<?php 可以用于所有类文件的开头,然后您可以在视图中使用 <?= ?>。双赢。 - Xeoncross
6
只要您对使用 PHP 5.4 没有问题,那么<?=的快捷方式本身是安全的。但广泛分发的 PHP 应用程序(如 WordPress)无法要求使用 5.4,甚至一直支持 PHP 4,直到2011年——在 PHP 5 发布7年后。如果您像Facebook这样的公司,在其中所有软件的安装都由公司自己直接操作,那么要求 5.4 支持就比在 WordPress 这样的项目上更容易实现。 - Frank Farmer

83
这整个讨论的问题在于将PHP用作模板语言。没有人争论应该在应用程序源文件中使用标签。
然而,PHP的可嵌入语法使它可以用作强大的模板语言,并且模板应尽可能简单易读。许多人发现使用速度慢得多的附加模板引擎(如Smarty)更容易,但对于我们这些坚持要求快速渲染和纯代码库的完美主义者来说,PHP是编写模板的唯一方法。
针对短标记使用的唯一有效反对意见是,它们不受所有服务器支持。与XML文档冲突的评论是荒谬的,因为您可能根本不应该混合PHP和XML;如果您这样做,应该使用PHP输出文本字符串。安全性永远不应该成为问题,因为如果您将敏感信息(例如数据库访问凭据)放在模板文件中,那么您就有更大的问题!
至于服务器支持的问题,必须认识到目标平台。如果共享托管是一个可能的目标,则应避免使用短标记。但对于许多专业开发人员(例如我自己),客户承认(并且确实依赖于事实)我们将决定服务器要求。通常我负责自己设置服务器。
我们从不与不能给我们绝对控制服务器配置的托管提供商合作-在这种情况下,我们可能会遇到比失去短标记支持更多的麻烦。这根本不会发生。
因此,我同意需要仔细权衡使用短标记。但我也坚信它应该始终是一个可选项,并且意识到自己环境的开发人员应该可以自由使用它们。

6
如果出于某种原因,你将apache设置为将.xml文件传递给mod_php处理,那么带有短标记的<?xml语句将会带来麻烦。但这显然是一种奇怪的设置。 - Frank Farmer
3
一种模板语言如果不能直接嵌入到某些输出文档中而需要使用变通方法,那么它是失败的。我之所以不应该在XML模板中使用PHP代码和短标签,是因为这样做行不通,而不是因为它没有意义。 - Vinko Vrsalovic
8
利用 PHP 作为快速、便捷的模板语言并不是一个“大失败”。正如我之前所说,这取决于权衡利弊并以适应所选方法的方式编写代码。不要仅仅因为在某个特定场景下它无法工作(而可以轻松解决)就对一个有效的方法进行归类性的否定。 - Brian Lacy
5
我并不会断然否定任何有效的方法(请看我的回答)。你是那个断然否定在XML中使用PHP的人,我引用你的话:“你根本不应该混合PHP和XML”。此外,我所提到的大问题是决定使用<?作为短标签,因为它会导致在XML中出现丑陋的变通方法。尽管如此,我认为这是权衡利弊的问题,如果你知道你在做什么,当然可以这么做。但这并不意味着<?是一个好选择。 - Vinko Vrsalovic
3
我来晚了,但我真的很喜欢这个答案,而且它反映了我的经验。虽然我们办公室在这个问题上存在一些分歧,但我可以说,在php方面工作了多年几乎每天,我从未遇到过这个问题。在我使用PHP生成XML时,它总是在高度动态内容的情况下进行的,从未直接通过PHP进行模板处理,因此这个问题从未出现过。 - redreinard
问题在于您的用户输出没有正确转义,而保持代码最小化而不是正确性的冲动会加剧这种情况。如果您已经做了更多的输出值,那么您也可以添加7个字符。 - svandragt

35
短标签因Zend Framework在其默认MVC配置中推动"PHP作为模板语言"而再次流行起来。我不明白争论的焦点在哪里,你一生中大部分要开发的软件都将在你或你公司控制的服务器上运行。只要保持一致,就不会有任何问题。 更新 经过与Magento相当数量的工作,它使用长格式。因此,我已切换到长格式:
<?php and <?php echo

结束

<? and <?=

似乎只需要一点点工作就可以确保互操作性。

8
我是一名自由职业者,我的所有代码都上传到共享主机上,所以完全没有控制权! :) - MDCore
12
如果你有足够的客户,就可以考虑搬到自己的托管服务器上。共享主机存在安全性和不稳定性问题。 - Jake McGraw
2
Zend 带回来的短标签显然没有流行起来,因为 Zend 正在使用长版本:http://framework.zend.com/manual/en/zend.view.scripts.html - Gerry
3
@Gerry,我最近也阅读了这篇文章,可以在此线程的最后一条评论中查看:更新.htaccess以启用短标签 - MrWhite
2
你应该真正纠正UPDATE后第一句话的语法,因为它在当前形式下没有意义。 - redreinard

24
因为它可能会与XML声明混淆。许多人同意你的看法,虽然有人持不同意见
另一个问题是,如果最终的托管服务器关闭了短标记,那么用短标记编写所有内容后会造成很大的麻烦...

1
@macek: 我知道那个。那只是我想到的第一个例子而已。再比如说,如果你要在 XML 文件中嵌入 PHP,那么你不能直接这样做。不要告诉我解决这个问题的方法,我已经知道了。关键是有很多种方式可以让 PHP 解析 XML 文件。你可能会用变通方法 (<?='<?xml') 或者说“你不应该这样做”来解决所有这些问题,但这并不能使事实消失。 - Vinko Vrsalovic
@macek:在PHP中生成RSS订阅。在PHP中生成任何类型的XML数据后端。有很多原因想要在PHP中生成XML文件。 - Matthew Scharley
@macek:用静态结构提供一个简单的XML文档,其中一些值从数据库中获取,这样就适合在XML中嵌入PHP。 - Vinko Vrsalovic
@vincko: 因此让.xml文件可被php解释器解析?坏主意!(没有留意日期,抱歉…) - Christoph Winkler
1
如果短标签无法正常工作,那么它们会带来什么麻烦呢?很容易批量替换 <?=<? echo。许多文本编辑器可以轻松处理同时对数千个文件进行此操作。 - Yamiko
显示剩余8条评论

21

2
这是在描述是否使用短的回声标签,与问题中提到的<?短标签不同(尽管在5.4之前它使用了相同的配置设置)。 - Alok
实际上,这应该是一个每个人都能理解的答案,尽管并没有真正解释为什么在许多情况下你不想使用短标签(例如,在共享主机系统上无法更改php.ini文件)。 - Björn K

15

如果还有人关注这个问题...自PHP 5.4.0 Alpha 1版本起,<?=始终可用:

http://php.net/releases/NEWS_5_4_0_alpha1.txt

因此看起来短标签(short tags)是可以接受的并且会保留下去的。至少现在是这样...


7
自PHP 5.4版本起,<?=不再被视为短标签。 - T0xicCode

14

https://www.php.net/manual/en/language.basic-syntax.phpmode.php有很多建议,包括:

虽然有些人觉得短标签和ASP风格标签很方便,但它们不太可移植,一般不建议使用。

以及

请注意,如果您在XML或XHTML中嵌入PHP代码,为了符合标准,您需要使用<?php ?>标签。

以及

在开发面向分发或部署在不受您控制的PHP服务器上的应用程序或库时,应避免使用短标签,因为目标服务器可能不支持短标签。对于可移植的、可分发的代码,请确保不使用短标签。


12
  • 对于某些网络服务器(共享主机等),默认情况下未开启短标签,因此如果您需要迁移到其中之一,则会出现代码移植性问题。

  • 可读性可能会成为问题。许多开发人员可能会发现,在扫描文件时,<?php<?作为代码块起始的更明显的标记,特别是当您面对 HTML和PHP紧密交织的代码库时。


2
95%的Web服务器启用了短标签。 - Paolo Bergantino
19
我不认同“易读性”的论点。如果你将PHP用作模板语言,<?= $var ?><?php echo $var ?>更易读。 - Frank Farmer
2
@Paulo 这可能自 2008 年以来已经改变了,但是 EC2 Ubuntu 和 Fedora 实例使用 yum install 和 apt-get 安装的 PHP 版本默认情况下已禁用短标记。 - Doug Molineux
2
使用完整标签,您将获得100% :) - E Ciotti
2
@FrankFarmer,我认为他正在比较没有回声的那个。<?<?php - Pacerier

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