PHP短标签是否可以使用?

时间:2008-10-14 10:21:05

标签: php coding-style php-shorttags

以下是信息according to the official documentation

  

有四对不同的   打开和关闭标签,可以   用于PHP。其中两个,<?php ?>   和<script language="php"> </script>,   随时可用。另外两个   是短标签和ASP样式标签,和   可以打开和关闭   php.ini配置文件。因此,   有些人发现短标签   ASP风格标签方便,它们是   不太便携,而且一般不会   推荐的

根据我的经验,大多数服务器都启用了短标签。打字

<?=

比输入

方便得多
<?php echo 

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

28 个答案:

答案 0 :(得分:366)

如果您不得不将代码移动到不受支持的服务器(并且您无法启用它),则不建议使用它们,因为它是PITA。正如你所说,许多共享主机支持短标签,但“批次”不是全部。如果要共享脚本,最好使用完整语法。

我同意程序员<?<?=<?php<?php echo更容易,但只要您可以进行批量查找和替换每次使用相同的表格(不要在空格中查看(例如:<? php<? =

我根本不把可读性作为理由。最认真的开发人员可以选择语法高亮显示。

正如ThiefMaster在评论中提到的那样, as of PHP 5.4, <?= ... ?> tags are supported everywhere, regardless of shorttags settings 。这应该意味着它们在可移植代码中使用是安全的,但这确实意味着它依赖于PHP 5.4+。如果您想支持5.4之前的版本并且不能保证短标签,您仍然需要使用<?php echo ... ?>

此外,您需要知道 ASP tags <% , %> , <%= , and script tag are removed from PHP 7 。因此,如果您想支持长期可移植代码,并希望切换到最现代的工具,请考虑更改代码部分。

答案 1 :(得分:171)

我太喜欢<?=$whatever?>让它离开。从来没有遇到过问题。我会等到它咬我的屁股。严肃地说,85%的(我的)客户可以在罕见的情况下访问php.ini。其他15%使用主流托管服务提供商,几乎所有这些都启用了它们。我爱他们。

答案 2 :(得分:139)

从PHP 5.4开始,回显快捷方式与短标记是一个单独的问题,因为始终会启用回显快捷方式。现在这是事实:

因此回声快捷方式本身(<?=)现在可以安全使用。

答案 3 :(得分:80)

整个讨论的问题在于使用PHP作为模板语言。没有人认为应该在应用程序源文件中使用标记。

然而,PHP的可嵌入语法允许它用作强大的模板语言,模板应尽可能简单易读。许多人发现使用像Smarty这样速度慢得多的附加模板引擎更容易,但对于那些要求快速渲染和纯代码库的纯粹主义者来说,PHP是编写模板的唯一方法。

禁止使用短标签的唯一有效参数是所有服务器都不支持它们。关于与XML文档冲突的评论是荒谬的,因为你可能不应该混合使用PHP和XML;如果你是,你应该使用PHP来输出文本字符串。安全永远不应该是一个问题,因为如果你在模板文件中放入数据库访问凭证等敏感信息,那么,你就会遇到更大的问题!

现在,关于服务器支持的问题,诚然必须要知道他们的目标平台。如果共享主机可能是目标,则应避免使用短标签。但对于许多专业开发人员(例如我自己),客户承认(实际上,取决于事实)我们将决定服务器要求。我经常负责自己设置服务器。

我们永远不会与托管服务提供商合作,因为托管服务提供商不能完全控制服务器配置 - 在这种情况下,我们可以指望运行更多的麻烦,而不仅仅是失去短标签支持。它不会发生。

是的 - 我同意应仔细权衡短标签的使用。但我也坚信它应该始终是一个选择,并且知道他的环境的开发者应该随意使用它们。

答案 4 :(得分:33)

由于Zend Framework推送PHP as a template language中的“default MVC configuration”,短标记即将返回。我不知道辩论是什么,你将在生命中产生的大部分软件将在你或你公司将控制的服务器上运行。只要你保持一致,就不应该有任何问题。

<强>更新

在使用长格式Magento做了大量工作之后。结果,我改用了以下的长篇:

<?php and <?php echo

<? and <?=

似乎只是为确保互操作性而做的少量工作。

答案 5 :(得分:20)

因为它可以用XML声明生成混淆。但是很多人agree with

另一个值得关注的问题是,用短标签对所有内容进行编码会产生的痛苦只是为了找出最终托管服务器关闭它们的结果......

答案 6 :(得分:19)

以下是相同的精彩流程图:

decision making tree of the use of <?=

来源:similiar question on Software Engineering Stack Exchange

答案 7 :(得分:13)

如果有人仍在关注此事......自PHP 5.4.0起,Alpha 1 <?=始终可用:

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

所以看起来短标签是(a)可接受的,(b)这里留下来。现在至少......

答案 8 :(得分:13)

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

  

虽然有些人发现短标签和   ASP风格标签方便,它们是   便携性较差,一般不会   推荐使用。

  

请注意,如果您正在嵌入PHP   在XML或XHTML中你需要   使用<?php ?>标记保留   符合标准。

  

应避免使用短标签   开发应用程序时   适合的图书馆   在PHP上重新分发或部署   不属于你的服务器   控制,因为短标签可能不是   目标服务器上支持。对于   便携式,可再发行的代码,是   一定不要使用短标签。

答案 9 :(得分:12)

  • 默认情况下,某些网络服务器(共享主机等)中没有启用短标记,因此如果您需要移动其中一个,代码可移植性会成为一个问题。

  • 对某些人来说,
  • 可读性可能是一个问题。许多开发人员可能会发现<?php在扫描文件时会将{eye}视为代码块开头的一个更明显的标记,而不是<?,特别是如果您遇到代码库{{1}} 3}}和PHP紧密交织。

答案 10 :(得分:10)

注意:从PHP 5.4开始,短标记<?=现在始终可用。

答案 11 :(得分:5)

我在查找有关该主题的信息后阅读了此页面,我觉得还没有提到一个主要问题:懒惰与一致性。 PHP的“真实”标签是&lt;?php和?&gt;。为什么?我真的不在乎。当那些显然适用于PHP时,为什么还要使用其他东西? &lt;%and%&gt;对我来说意味着ASP,而&lt; script .....意味着Javascript(在大多数情况下)。因此,为了保持一致性,快速学习,可移植性和简单性,为什么不坚持标准?

另一方面,我同意模板中的短标签(仅在模板中)似乎很有用,但问题是我们在这里花了很多时间讨论它,可能需要很长时间才能实际上浪费了很多时间来输入“php”的额外三个字符!!

虽然有很多选择很好,但它根本不符合逻辑,它可能会导致问题。想象一下,如果每种编程语言都允许4种或更多类型的标签:Javascript可以是&lt; JS或&lt;脚本....或&lt;%或&lt;? JS ....会有帮助吗?在PHP的情况下,解析顺序倾向于允许这些东西,但语言在许多其他方面不灵活:它在最轻微的不一致时抛出通知或错误,但经常使用短标签。当在不支持短标签的服务器上使用短标签时,由于在某些情况下没有给出错误,因此可能需要很长时间才能找出错误。

最后,我认为短标签不是问题所在:PHP代码块只有两种逻辑类型 - 1)常规PHP代码,2)模板回声。 对于前者,我坚信只有&lt;?php和?&gt;应该允许只是为了保持一致和便携。 对于后者,&lt;?= $ var?&gt;方法很难看。为什么一定要这样?为什么不添加更符合逻辑的东西? &lt;?php $ var?&gt; 那不会做任何事情(只有在最遥远的可能性中它才能与某些东西发生冲突),这很容易取代尴尬的&lt;?=语法。或者,如果这是一个问题,也许他们可以使用&lt;?php = $ var?&gt;相反,不要担心不一致。

在有4个打开和关闭标记选项以及随机添加特殊“echo”标记的位置,PHP也可能在php.ini或.htaccess中有一个“自定义打开/关闭标记”标记。这样设计师可以选择他们最喜欢的那个。但由于显而易见的原因,这些都是过度的。那么为什么要允许4个以上的选项?

答案 12 :(得分:3)

当您使用具有单独视图文件的MVC框架或CMS时,最好使用它们。
它快速,代码少,不会让设计者感到困惑。只需确保您的服务器配置允许使用它们。

答案 13 :(得分:3)

有一点不同的情况是开发CodeIgniter应用程序时。每当在模板/视图中使用PHP时,CodeIgniter似乎都使用短标签,否则对于模型和控制器,它总是使用长标签。它不是框架中的硬性规则,但在大多数情况下,框架和来自其他用途的大量来源遵循这一惯例。

我的两分钱?如果您从未计划在其他地方运行代码,那么可以根据需要使用它们。当我意识到这是一个愚蠢的想法时,我宁愿不必进行大规模的搜索和替换。

答案 14 :(得分:3)

让我们面对现实吧。 PHP很难看,没有短标记。

如果您无法访问.htaccess,可以在php.ini文件中启用它们:

php_flag short_open_tag on

答案 15 :(得分:3)

默认情况下,

<?在较新版本中处于禁用状态。您可以按照 Enabling Short Tags in PHP 所述启用此功能。

答案 16 :(得分:2)

为了避免可移植性问题,请使用<?php启动PHP标记,如果您的PHP文件纯粹是PHP,没有HTML,则不需要使用结束标记。

答案 17 :(得分:2)

使用短标签的恕我直言的人经常忘记逃避他们所回应的任何事情。如果默认情况下有一个模板引擎转义会很高兴。我相信Rob A写了一个快速的黑客来逃避Zend Frameworks应用程序中的短标签。如果你喜欢短标签,因为它使PHP更容易阅读。那么Smarty可能是更好的选择吗?

{$myString|escape}

对我来说看起来比

更好
<?= htmlspecialchars($myString) ?> 

答案 18 :(得分:2)

人们必须问一下使用短标签是什么意思。

更快地输入

MDCore说:

  

<?=比输入<?php echo

更方便

是的,确实如此。您不必在整个脚本中键入7个字符* X次。

但是,当一个脚本需要一个小时,或者10个小时或更长时间来设计,开发和编写时,在脚本的持续时间内,在这里和那里不输入这7个字符的几秒钟的相关性是多少?

与某些核心或全部脚本无法正常工作的情况相比,如果没有打开短标签,或者打开但是更新或有人更改ini文件/服务器配置会阻止它们工作,其他潜力。

您获得的微小收益并不会超过潜在问题的严重程度,即您的网站无法正常工作,或者更糟糕的是,只有部分网站无法正常工作,因而难以解决。

易于阅读

这取决于熟悉度 我一直看到并使用<?php echo。因此虽然<?=并不难阅读,但我并不熟悉,因此不易阅读

与前端/后端开发人员分离(与大多数公司一样),处理这些模板的前端开发人员会更熟悉熟悉知道<?=等于“PHP open tag并回声“?
我会说大多数人会对更合乎逻辑的人感到更舒服。也就是说,一个清晰的PHP开放标签然后发生了什么“回声” - <?php echo

风险评估
问题=整个站点或核心脚本无法正常工作;

问题的可能性非常低 +结果的严重程度非常高 = 高风险

结论

你可以在这里节省几秒钟而不必输入几个字符,但是它有很大的风险,因此也可能会失去可读性。

前端或后端编码器熟悉<?=更有可能理解<?php echo,因为它们是标准的PHP内容 - 标准<?php开放代码和众所周知的“回声”。
(甚至前端编码器应该知道“回声”,或者他们根本不会处理框架所服务的任何代码)。

虽然反过来的可能性不大,但有人不太可能逻辑推断PHP短标签上的等号是“echo”。

答案 19 :(得分:1)

  • 如果您确定服务器会支持短标签并且您的开发人员会理解它,则可以使用短标签。
  • 许多服务器都不支持它,许多开发人员在看到它之后就会理解它。
  • 我使用完整标签来确保可移植性,因为它真的没那么糟糕。

话虽如此,我的一位朋友说这个,支持替代标准化的 asp风格的标签,比如<%而不是<?,这是一个设置php.ini名为asp_tags。这是他的推理:

  

... 任意约定应该是   标准化即可。也就是说,任何时候我们都是   面对一系列的可能性   都是同等价值的 - 比如什么   奇怪的标点我们的编程   语言应该用来划分   本身 - 我们应该选择一个标准   方式并坚持下去。那样我们   减少所有人的学习曲线   语言(或任何东西)   惯例属于)。

对我来说听起来不错,但我认为我们中的任何一个人都不能绕着这个原因绕行。与此同时,我会坚持完整<?php

答案 20 :(得分:1)

<?(没有尾随空格)转换为<?php(带有尾随空格):

find . -name "*.php" -print0 | xargs -0 perl -pi -e 's/<\?(?!php|=|xml|mso| )/<\?php /g'

<?(带尾随空格)转换为<?php(保留尾随空格):

find . -name "*.php" -print0 | xargs -0 perl -pi -e 's/<\? /<\?php /g'

答案 21 :(得分:1)

我认为值得一提的是从PHP 7开始:

  • 简短ASP PHP标记<% … %>不见了
  • 如果<? … ?>设置为true,则短PHP标签short_open_tag仍可用。这是默认设置。
  • 自PHP 5.4起,无论<?=… ?>设置如何,短打印标记short_open_tag始终启用。

第一个很好,因为它干扰了其他语言。

除个人喜好外,现在没有理由不使用短标签。

当然,如果您编写的代码与PHP 5的旧版本兼容,则需要遵守旧规则,但请记住,PHP 5.6之前的任何内容现在都不受支持。

请参阅:https://secure.php.net/manual/en/language.basic-syntax.phptags.php

答案 22 :(得分:0)

如果您关心XSS,那么您应该在大多数情况下使用<?= htmlspecialchars(…) ?>,因此短标记不会产生很大的影响。

即使您将echo htmlspecialchars()缩短为h(),这仍然是一个问题,您必须记住几乎每次都添加它(并试图跟踪哪些数据是预先转义的,哪些是未转义的 - 但是无害只会更容易犯错误。)

我默认使用安全的a templating engine并为我写<?php个标签。

答案 23 :(得分:0)

<?php ?>使用起来要好得多,因为这种编程语言的开发人员已经大量更新了他们的核心语言。您可以看到短标签和长标签之间的区别。

短标签将突出显示为浅红色,而较长的标签则突出显示为较暗!

然而,回应一些事情,例如:<?=$variable;?>很好。但更喜欢更长的标签。 <?php echo $variable;?>

答案 24 :(得分:0)

短标签始终在php中可用。     因此,您无需在脚本中回显第一条语句

示例:

    $a =10;
    <?= $a;//10 
    echo "Hellow";//
    echo "Hellow";

   ?>

突然,您需要使用单个php脚本,那么您可以     用它。     例如:

<html>
<head>
<title></title>
</head>  
<body>
<p>hellow everybody<?= hi;?></p>
<p>hellow everybody  </p> 
<p>hellow everybody  </p>   
</body>
</html>

答案 25 :(得分:0)

截至2019年,我不同意此处的某些答案。我建议使用长标签

<?php /* code goes here */ ?>

短回声标签

<?= /* code goes here */ ?>

原因:PSR-1 basic coding standard推荐它们

不建议使用其他短标签,例如<? /* code goes here */ ?>

规范说:

  

PHP代码必须使用长标签或短回声   标签; 不得使用其他标签变体

答案 26 :(得分:0)

3个标记在php中可用:

  1. <?php ?>不需要指示任何已​​配置的长格式标签
  2. short_open_tag,如果其中有short_open_tag选项,则<? ?>可用 php.ini已打开
  3. 自php 5.4.0起缩短标签<?=,因为它始终可用

从php 7.0.0 asp和脚本标记中删除

答案 27 :(得分:-6)

不,他们是being phased out by PHP 6所以如果您感谢代码的使用寿命,请不要使用它们或<% ... %>代码。