提问



这是根据官方文件的信息:[58]



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



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


<?=


打字要方便得多


<?php echo 


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

最佳参考


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


我同意程序员<?<?=<?php<?php echo更容易,但只要你使用同样的东西就可以进行批量查找和替换。每次形成(并且不要在空间中丢弃(例如:<? php<? =)


我根本不把可读性作为一个理由。大多数认真的开发人员可以选择语法高亮。


正如ThiefMaster在评论中提到的那样,从PHP 5.4开始,<?= ... ?>标签随处可见,无论短标签设置如何。这应该意味着它们可以安全地在可移植代码中使用,但这确实意味着它们依赖于PHP 5.4+。如果你想支持5.4之前并且不能保证短标签,你仍然需要使用<?php echo ... ?>[59]


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

其它参考1


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

其它参考2


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



  • Rasmus Lerdorf的SVN修订

  • 邮件列表讨论



所以回声快捷键本身(<?=)现在可以安全使用。[61] [62]

其它参考3


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


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


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


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


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


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

其它参考4


由于Zend Framework在其默认的MVC配置中推送PHP作为模板语言,因此短标签回归。我不知道辩论是什么,你一生中生产的大多数软件都会在你或你公司控制的服务器上运行。只要你保持一致,就不会有任何问题。[[[63] [64] [65]


更新


在与使用长形式的Magento做了很多工作之后。结果,我转而采用长期形式:[66]


<?php and <?php echo


过度


<? and <?=


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

其它参考5


因为它可以用XML声明生成混淆。不过,很多人都同意你的看法。 [67] [68]


另一个值得关注的问题是,它产生的痛苦是用短标签对所有内容进行编码,最后才发现最终托管服务器已将其关闭...

其它参考6


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





来源:关于软件工程堆栈交换的类似问题[69]

其它参考7


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



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







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







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


其它参考8


如果有人仍然关注这个......自PHP 5.4.0起,Alpha 1 <?=始终可用:




http://php.net/releases/NEWS_5_4_0_alpha1.txt[71]


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

其它参考9



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

  • 对某些人来说,
  • 可读性可能是一个问题。许多开发人员可能会发现,当您扫描文件时,<?php作为代码块开头的一个更明显的标记而不是<?,特别是如果您坚持使用HTML和代码库PHP紧密交织。[72]


其它参考10


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

其它参考11


我在寻找有关该主题的信息之后阅读了这个页面,我觉得还没有提到一个主要问题:懒惰与一致性。 PHP的真实标签是<?php和?>。为什么?我真的不在乎。为什么在那些明显用于PHP的时候你想要使用别的东西?<%and%>对我来说意味着ASP,< script .....意味着Javascript(在大多数情况下)那么为了保持一致性,快速学习,便携性和简单性,为什么不坚持标准呢?


另一方面,我同意模板中的短标签(并且仅在模板中)看起来很有用,但问题是我们在这里花了很多时间讨论它,它可能需要很长时间才能真正浪费那么多时间输入php的额外三个字符!!


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


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


在有4个打开和关闭标签选项以及随机添加特殊echo标签的点上,PHP也可能在php.ini或.htaccess中有一个自定义打开/关闭标签标志。这样设计师可以选择他们最喜欢的那个。但是由于显而易见的原因,这种情况太过分了。那么为什么要选择4个以上呢?

其它参考12


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

其它参考13


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


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

其它参考14


让我们面对现实吧。如果没有短标签,PHP很丑陋。


如果你不能进入php.ini,可以在.htaccess文件中启用它们:


php_flag short_open_tag on

其它参考15


<?在较新版本中默认禁用。您可以启用此功能,如在PHP中启用短标签所述。[74]

其它参考16


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


{$myString|escape}


对我来说看起来比...更好


<?= htmlspecialchars($myString) ?> 

其它参考17


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


更快地输入


MDCore说:



  <?=比输入<?php echo方便得多



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


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


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


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


易于阅读


这取决于熟悉度。

我总是看到并使用<?php echo。所以虽然<?=不难阅读,但我并不熟悉,因此不容易阅读。


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


风险评估

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


问题的潜力非常低 +结果的严重程度非常高=高风险


结论


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


前端或后端编码器熟悉与<?=更有可能理解<?php echo,因为它们是标准PHP事物 - 标准<?php开放标记,并且非常有名回声。结果
(甚至前端编码器应该知道回声,或者他们根本不会处理框架所服务的任何代码)。


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

其它参考18


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

其它参考19



  • 如果您确定服务器会支持短标签并且您的开发人员会理解它,则可以使用短标签。

  • 许多服务器不支持它,许多开发人员在看到它之后就会理解它。

  • 我使用完整的标签来确保可移植性,因为它真的不是那么糟糕。



话虽如此,我的一个朋友说这个,支持备用的标准化的 asp样式标签,如<%而不是<?,这是php.ini中的一个设置叫做asp_tags。这是他的推理:



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



对我来说听起来不错,但我认为我们中的任何一个人都不能绕着这个原因圈出货车。与此同时,我会坚持到最后<?php

其它参考20


<?(没有尾随空格)转换为<?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


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



  • 短PHP标签<? … ?>不见了

  • 自PHP 5.4以来,无论short_open_tag设置如何,短打印标签<?=… ?>都始终启用。



因为它干扰了其他语言,所以很好地摆脱了第一个问题。


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


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


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

其它参考22


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


即使你缩短echo htmlspecialchars()h(),你仍然需要记住几乎每次都添加它(并试图跟踪哪些数据是预先转义的,这是未转义的 - 但是 - 无害只会使错误更容易发生)。


我使用默认安全的模板引擎并为我写<?php标签。[77]

其它参考23


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


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


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

其它参考24


不,并且他们被PHP 6逐步淘汰,所以如果你欣赏代码长寿,就不要使用它们或<% ... %>标签。[78]