533

这是根据官方文档的信息:

有四对不同的开始和结束标签可以在 PHP 中使用。其中两个<?php ?><script language="php"> </script>始终可用。另外两个是短标签和 ASP 样式标签,可以从 php.ini 配置文件中打开和关闭。因此,虽然有些人发现短标签和 ASP 样式标签很方便,但它们的可移植性较差,通常不推荐使用

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

<?=

比打字方便多了

<?php echo 

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

4

28 回答 28

381

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

我同意<?and<?=对程序员来说比<?phpand更容易,<?php echo但是只要您每次都使用相同的表单(并且不要插入空格(例如:<? php<? =) ,就可以进行批量查找和替换

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

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

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

于 2008-10-14T10:31:56.567 回答
178

我太喜欢<?=$whatever?>放手了。从来没有遇到过问题。我会等到它咬我的屁股。说真的,85% 的(我的)客户在他们被关闭的极少数情况下可以访问 php.ini 。其他 15% 使用主流托管服务提供商,几乎所有人都启用了它们。我爱他们。

于 2008-10-14T23:14:10.930 回答
147

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

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

于 2011-05-19T20:58:10.240 回答
83

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

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

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

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

而且我们从不与不能让我们绝对控制服务器配置的托管服务提供商合作——在这种情况下,我们可以指望运行比失去短标签支持更多的麻烦。它只是不会发生。

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

于 2009-12-21T23:16:31.430 回答
35

由于Zend Framework在其默认 MVC 配置中推动了“ PHP 作为模板语言”,短标签又回来了。我不明白辩论是关于什么的,您一生中将生产的大多数软件都将在您或您的公司将控制的服务器上运行。只要你保持一致,就不应该有任何问题。

更新

在使用长格式的Magento做了相当多的工作之后。结果,我切换到了长格式:

<?php and <?php echo

超过

<? and <?=

似乎需要做少量工作来确保互操作性。

于 2008-10-21T21:45:15.287 回答
23

因为它可能与 XML 声明产生混淆。不过,很多人都同意 你的看法。

另一个问题是它会产生痛苦,用短标签对所有内容进行编码,最终发现最终托管服务器已关闭它们......

于 2008-10-14T10:24:52.557 回答
21

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

<?= 的使用决策树

资料来源:软件工程堆栈交换上的类似问题

于 2013-04-24T05:10:30.413 回答
15

万一有人还在关注这一点……从 PHP 5.4.0 开始,Alpha 1<?=始终可用:

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

所以看起来短标签是(a)可以接受的并且(b)可以保留。至少目前...

于 2011-08-16T14:51:29.793 回答
14

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

虽然有些人发现短标签和 ASP 样式标签很方便,但它们的可移植性较差,通常不推荐使用。

请注意,如果您将 PHP 嵌入到 XML 或 XHTML 中,您将需要使用<?php ?>标签来保持与标准的兼容。

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

于 2011-05-30T11:34:03.193 回答
12
  • 在某些网络服务器(共享主机等)中,默认情况下不会打开短标签,因此如果您需要移至其中之一,代码可移植性就会成为一个问题。

  • 对某些人来说,可读性可能是个问题。许多开发人员可能会发现,与扫描文件相比,它<?php作为代码块开始的更明显标记更引人注目<?,尤其是当您遇到HTML和 PHP 紧密交织的代码库时。

于 2008-10-14T10:25:10.700 回答
12

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

于 2012-05-30T12:14:24.810 回答
6

我在查找有关该主题的信息后阅读了此页面,我觉得没有提到一个主要问题:懒惰与一致性。PHP 的“真实”标签是 <?php 和 ?>。为什么?我真的不在乎。当那些显然是用于 PHP 的时候,你为什么要使用其他东西呢?<% 和 %> 对我来说意味着 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+ 选项呢?

于 2010-07-09T02:58:18.120 回答
5

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

1. 长标签

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

2.短回声标签

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

原因:PSR-1基本编码标准推荐

<? /* code goes here */ ?>不推荐使用其他短标签。

规范说:

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

于 2019-09-02T11:04:39.957 回答
4

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

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

于 2008-10-14T22:12:25.390 回答
4

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

于 2012-04-20T11:50:33.567 回答
4

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

于 2012-11-06T21:06:05.230 回答
3

面对现实吧。没有短标签的 PHP 丑得要命。

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

php_flag short_open_tag on
于 2009-11-08T19:46:15.840 回答
3

恕我直言,使用短标签的人经常忘记逃避他们正在回响的任何内容。最好有一个默认转义的模板引擎。我相信 Rob A 写了一个快速破解方法来逃避 Zend Frameworks 应用程序中的短标签。如果您喜欢短标签,因为它使 PHP 更易于阅读。那么Smarty可能是一个更好的选择吗?

{$myString|escape}

对我来说看起来比

<?= htmlspecialchars($myString) ?> 
于 2011-04-13T16:51:31.800 回答
3

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

于 2011-05-30T11:39:04.370 回答
3

人们不得不问使用短标签有什么意义。

打字更快

MDCore 说:

<?=比打字方便多了<?php echo

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

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

与一些核心或所有脚本的潜力相比,如果短标签未打开,或者打开但更新或有人更改 ini 文件/服务器配置阻止它们工作,则其他潜力。

您获得的小小好处并没有超过潜在问题的严重性,即您的网站无法正常工作,或者更糟糕的是,只有部分网站无法正常工作,因此令人头疼。

更容易阅读

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

并且随着前端/后端开发人员的拆分(与大多数公司一样),处理这些模板的前端开发人员是否会更熟悉知道<?=等于“PHP 开放标记和回显”?
我会说大多数人会更喜欢更合乎逻辑的那个。也就是说,一个明确的 PHP 打开标记,然后是发生了什么“回声” - <?php echo

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

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

结论

您可以在这里和那里节省几秒钟,而不必输入几个字符,但为此冒了很大的风险,并且还可能因此失去可读性。

熟悉的前端或后端编码人员<?=更容易理解<?php echo,因为它们是标准的 PHP 东西——标准的<?php开放标签和众所周知的“回声”。
(即使是前端编码人员也应该知道“echo”,否则他们根本不会处理框架提供的任何代码)。

而相反的可能性不大,有人不太可能从逻辑上推断出 PHP 短标签上的等号是“回声”。

于 2014-03-09T17:01:53.573 回答
3

我认为值得一提的是,从 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

于 2018-04-17T11:15:17.763 回答
2
  • 如果您确定服务器将支持它并且您的开发人员会理解它,则可以使用短标签。
  • 很多服务器不支持,很多开发者看过一次就明白了。
  • 我使用完整的标签来确保可移植性,因为它真的没那么糟糕。

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

...任意约定应该标准化。也就是说,任何时候我们面对一组具有相同价值的可能性——比如我们的编程语言应该使用什么奇怪的标点来划分自身——我们应该选择一种标准的方式并坚持下去。这样我们就减少了所有语言的学习曲线(或任何与约定有关的东西)。

对我来说听起来不错,但我认为我们中的任何人都不能围绕这个事业绕圈子。同时,我会坚持完整的<?php

于 2009-08-10T18:41:38.973 回答
2

短标签在 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>
于 2019-03-20T06:07:47.420 回答
1

如果你关心XSS,那么你应该<?= htmlspecialchars(…) ?>大部分时间都使用,所以短标签不会有很大的不同。

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

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

于 2008-10-21T21:27:18.160 回答
1

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

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

但是,呼应一些东西,例如:<?=$variable;?>很好。但更喜欢较长的标签。<?php echo $variable;?>

于 2015-10-14T01:16:07.430 回答
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'
于 2015-11-29T06:12:51.223 回答
1

php 中有 3 个标签:

  1. <?php ?>不需要指示任何配置的长格式标签
  2. php.ini 中的short_open_tag<? ?> 选项打开时可用的 short_open_tag
  3. 从 php 5.4.0 开始缩短标签<?= ,它始终可用

从 php 7.0.0 asp 和 script 标签被删除

于 2019-09-21T18:35:34.500 回答
-5

不,它们正在被 PHP 6 淘汰,所以如果你喜欢代码的长寿,那就不要使用它们或<% ... %>标签。

于 2008-10-16T01:19:26.447 回答