PHP短标记是否可以使用?

下面是信息根据官方文件:

有四对不同的 可以是开始和结束标记 用于PHP。两个,<?php ?> 和# EYZ0, 总是可用的。另外两个 是短标签和ASP风格标签,和 可以打开和关闭从 Php.ini配置文件。因此, 而有些人发现短标签和 ASP样式标签方便,它们都是 可移植性较差,一般不是 推荐< /强>。< / p >

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

<?=

比打字方便多了

<?php echo

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

119143 次浏览

因为它会与XML声明产生混淆。不过很多人都是你。

另一个问题是,如果用短标签编码所有东西,最后却发现最终的托管服务器已经关闭了它们,这会带来痛苦……

  • 短标签在某些web服务器(共享主机等)默认情况下是不打开的,所以如果你需要移动到其中一个,代码可移植性就会成为一个问题。

  • 可读性对某些人来说可能是个问题。许多开发人员可能会发现,在扫描文件时,<?php作为代码块的开始标记比<?更引人注目,特别是当您被HTML和PHP紧密结合在一起的代码库所吸引时。

PHP短标记(<?)和快速回显标记(<?=)之间必须有明确的区别。

前者被编码标准禁止,主要是出于常识,因为如果您必须将代码移到不支持它的服务器上(并且您不能启用它),那么它就是一个PITA。正如你所说,许多共享主机支持短标签,但“lots"不是所有的。如果您希望共享脚本,最好使用完整的语法。

而快捷回显标记<?=不能被禁用,因此完全可以使用。

我同意<?对程序员来说比<?php更容易,但是只要每次使用相同的表单,就可以进行大量的查找和替换。

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

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

此外,您还需要知道ASP tags <%, %>PHP 7中删除了、<%=和script标签. #因此,如果您想要支持长期可移植的代码,并想要切换到最现代的工具,请考虑更改这部分代码。

一种稍有不同的情况是在开发CodeIgniter应用程序时。CodeIgniter似乎在模板/视图中使用PHP时使用短标签,否则在模型和控制器中它总是使用长标签。这并不是框架中的硬性规则,但在大多数情况下,框架和许多来自其他用途的源代码都遵循这一约定。

我的意见?如果您从未打算在其他地方运行这些代码,那么如果您愿意,可以使用它们。当我意识到这是一个愚蠢的想法时,我宁愿不做大量的搜索和替换。

我太喜欢<?=$whatever?>了,舍不得放手。从来没有问题。我会一直等到它咬到我的屁股。说真的,85%的(我的)客户在罕见的的情况下可以访问php.ini。另外15%使用主流主机提供商,而且几乎所有的提供商都启用了主流主机提供商。我爱他们。

不,它们是被PHP 6淘汰,所以如果你喜欢代码寿命,就不要使用它们或<% ... %>标记。

如果您关心XSS,那么大多数时候应该使用<?= htmlspecialchars(…) ?>,因此短标记不会有太大区别。

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

我使用默认情况下安全的模板引擎,并为我编写<?php标记。

由于Zend框架默认MVC配置中按了“PHP作为模板语言”,短标签又回来了。我不明白争论的是什么,你一生中生产的大部分软件都将在你或你的公司控制的服务器上运行。只要你能始终如一,就不会有任何问题。

更新

在使用使用长格式的线上购物做了相当多的工作之后。因此,我改用了长形式的:

<?php and <?php echo

<? and <?=

为了确保互操作性,似乎只需要做少量的工作。

  • 如果您确定服务器将支持短标记,并且您的开发人员能够理解它,那么使用短标记是可以接受的。
  • 许多服务器不支持它,许多开发人员在看过一次之后就会理解它。
  • 我使用完整的标记来确保可移植性,因为它真的没有那么糟糕。

说了这么多,我的一个朋友说,在支持替代标准化 aspstyle标签,像<%而不是<?,这是一个设置在php.ini中称为asp_tags。他的理由如下:

< p >…任意约定应为 标准化> < /强。也就是说,任何时候我们都可以 面对一系列的可能性 都是等价的,比如什么 奇怪的标点符号我们的编程 应该用语言来界定 我们应该选择一个标准 坚持下去。这样我们 减少所有人的学习曲线 语言(或者其他的东西 公约属于)。< / p >

听起来不错,但我不认为我们所有人都能在这件事上保持一致。与此同时,我将坚持使用完整的<?php

让我们面对现实吧。没有短标记的PHP非常丑陋。

如果你无法获得php.ini,你可以在.htaccess文件中启用它们:

php_flag short_open_tag on

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

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

反对使用短标记的唯一有效论点是,并不是所有服务器都支持短标记。关于与XML文档冲突的注释是可笑的,因为无论如何您都不应该混合使用PHP和XML;如果你是,你应该使用PHP输出文本字符串。安全性永远不应该成为问题,因为如果您将数据库访问凭证等敏感信息放在模板文件中,那么您就会遇到更大的问题!

现在,关于服务器支持的问题,我们必须清楚自己的目标平台。如果共享主机是一个可能的目标,那么应该避免使用短标记。但是对于许多专业开发人员(比如我自己)来说,客户端承认(实际上,这取决于事实)我们将决定服务器需求。通常我自己负责设置服务器。

我们从未与不给予我们绝对控制服务器配置的主机提供商合作——在这种情况下,我们可能会遇到更多麻烦,而不仅仅是失去短标签支持。这是不会发生的。

所以,是的,我同意短标签的使用应该仔细权衡。但我也坚信这应该是一种选择,并且了解环境的开发人员应该自由地使用它们。

我在寻找了这个主题的信息后读了这篇文章,我觉得有一个主要的问题没有被提及:懒惰vs.一致性。PHP的“真正”标签是<?PHP和?>为什么?我真的不在乎。这些明明是PHP的,为什么还要用别的东西呢?<%和%>意思是ASP对我,和<脚本.....意味着Javascript(在大多数情况下)。因此,为了一致性、快速学习、可移植性和简单性,为什么不坚持标准呢?

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

虽然有很多选择很好,但这完全不合逻辑,而且会导致问题。想象一下,如果每种编程语言都允许4种或更多类型的标签:Javascript可以是<JS或<脚本…还是<%或<?JS……那会有用吗?在PHP的例子中,解析顺序倾向于允许这些事情,但是该语言在许多其他方面并不灵活:它会在最轻微的不一致时抛出通知或错误,但是经常使用短标记。当短标记在不支持它们的服务器上使用时,可能需要很长时间才能找出错误,因为在某些情况下没有给出错误。

最后,我不认为短标签是问题所在:PHP代码块只有两种逻辑类型——1)常规PHP代码,2)模板回显。 对于前者,我坚信只有<?PHP和?>应该允许保持所有东西的一致性和可移植性。 对于后者,<?=$var?>方法是丑陋的。为什么一定要这样?为什么不添加一些更有逻辑的东西呢? & lt; ?PHP $var ? 这不会起任何作用(只有在最遥远的可能性下,它才会与某些东西发生冲突),而且很容易取代尴尬的<?=语法。如果这是一个问题,也许他们可以使用<?php=$var?>相反,不要担心不一致。

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

恕我直言,使用短标签的人经常忘记转义他们所呼应的内容。如果有一个默认转义的模板引擎就好了。我相信Rob A写了一个快速的hack来避免在Zend框架应用程序中的短标签。如果您喜欢短标签,因为它使PHP更容易阅读。那么Smarty是不是一个更好的选择呢?

{$myString|escape}

在我看来,这比

<?= htmlspecialchars($myString) ?>

从PHP 5.4开始,echo快捷方式与短标记是分开的问题,因为echo快捷方式将始终启用。现在这是事实:

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

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

,而有些人发现短标签和 ASP样式标签方便,它们都是 便携性较差,而且通常不是 推荐。< / p >

而且

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

而且

应避免使用短标签 在开发应用程序或 用于 重新分配,或者在PHP上部署 不属于你的服务器 控件,因为短标记可能不是 目标服务器支持。为 可移植的、可重新分发的代码

为了避免可移植性问题,使用<?php开始PHP标记,如果您的PHP文件是纯PHP,而不是HTML,则不需要使用结束标记。

如果有人还在关注这个…从PHP 5.4.0 Alpha 1 <?=一直可用:

http://php.net/releases/NEWS_5_4_0_alpha1.txt < a href = " http://php.net/releases/NEWS_5_4_0_alpha1.txt " > < / >

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

<?在新版本中默认禁用。您可以像在PHP中启用短标签所描述的那样启用它。

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

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

以下是其美妙的流程图:

决策树的使用<?=

来源:# EYZ0

有人会问使用短标签的意义是什么。

# EYZ0

MDCore说:

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

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

然而,当一个脚本需要一个小时,或10个小时,或更多的时间来设计、开发和编写,那么在脚本的整个过程中,这几秒钟没有在这里和那里输入那7个字符的时间又有什么关系呢?

相比之下,如果短标签没有打开,或正在打开,但更新或有人更改ini文件/服务器配置,可能会导致一些核心或所有脚本无法工作,其他可能性。

您获得的小好处并不能抵消潜在问题的严重性,即您的站点无法工作,或者更糟,只有部分无法工作,因此需要解决的问题令人头痛。

# EYZ0

这取决于熟悉 我总是看到并使用<?php echo。因此,虽然<?=并不难读,但我并不熟悉不容易阅读。< / p > 如果前端和后端开发人员分开(就像大多数公司一样),那么前端开发人员在使用这些模板时是否会更清楚熟悉 =“PHP打开标签和回显”?< br > 我想说大多数人会觉得更合乎逻辑的答案更舒服。也就是说,一个明确的PHP打开标记,然后发生什么“echo”- <?php echo。< / p > < p > # EYZ0 < br >

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

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

# EYZ0

你可以在这里节省几秒钟,而不必输入几个字符,但为此冒了很大的风险,结果也可能会失去可读性。

前端或后端编码员熟悉<?=更有可能理解<?php echo,因为他们是标准的PHP东西-标准的<?php打开标签和非常著名的“echo” (即使是前端程序员也应该知道“echo”,否则他们根本不会在框架提供的任何代码上工作)。< / p >

然而相反的情况就不太可能发生了,有人不太可能从逻辑上推断出PHP短标记上的等号是“echo”。

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

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

但是,回显一些内容,例如:<?=$variable;?>是可以的。但更喜欢长标签。# EYZ1

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

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

  • 短的ASP PHP标签<% … %>消失了
  • 短PHP标签<? … ?>仍然可用,如果short_open_tag设置为true。这是默认值。
  • 从PHP 5.4开始,短的打印标签<?=… ?>总是启用,不管short_open_tag设置如何。

摆脱第一个语言是件好事,因为它干扰了其他语言。

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

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

看到:# EYZ0

还要注意,上面的引用不鼓励使用第二个版本(<? … ?>),因为它可能已经被禁用了:

< p >注意:
由于短标签可以被禁用,建议只使用普通标签(<?php ?><?= ?>)来最大化兼容性
短标签在php中总是可用的。 所以你不需要回显脚本中的第一个语句

例子:

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


?>
突然你需要使用一个单独的php脚本,然后你可以 使用它。 例子:< / p >
<html>
<head>
<title></title>
</head>
<body>
<p>hellow everybody<?= hi;?></p>
<p>hellow everybody  </p>
<p>hellow everybody  </p>
</body>
</html>

截至2019年,我不同意这里的某些答案。推荐使用:

1. 长标签

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

2. 短回声标签

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

原因:它们是PSR-1基本编码标准推荐的

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

说明书说:

PHP代码必须使用长标签或短回显 标签;# EYZ0。< / p >

php中有3个标签:

  1. 长形式标签,<?php ?>不需要指令任何配置
  2. 如果short_open_tag选项在
  3. short_open_tag, <? ?>可用 Php.ini在
  4. 缩短标签<?=自php 5.4.0以来,它总是可用的

从PHP 7.0.0删除asp和script标签