【问题标题】:What is the difference between the PHP open tags “<?=” and “<?php”/“<?”?PHP 开放标签“<?=”和“<?php”/“<?”有什么区别?
【发布时间】:2012-05-28 09:43:23
【问题描述】:

抱歉这个愚蠢的问题,但我遇到了使用的代码:

<?=$MAP_OBJECT->printOnLoad();?>
<?=$MAP_OBJECT->printMap();?>
<?=$MAP_OBJECT->printSidebar();?>

&lt;?=&lt;?php 相比有什么特别之处吗?或者只是简单的&lt;?

【问题讨论】:

  • 试图通过搜索功能注入一些代码?

标签: php syntax


【解决方案1】:

它们是&lt;?php echo .... ?&gt; 的简写,称为short tags。您应该避免使用它们,因为:

  • 它们似乎在某些服务器上已关闭
  • 他们会给您带来安全方面的麻烦
  • 它们可能会与&lt;?xml ... ?&gt; 等处理指令产生冲突

因此你不应该再使用它们,也看看:

PHP Short Open Tag: Convenient Shortcut or Short Changing Security?

【讨论】:

  • short_open_tag ini 选项已弃用。
  • @salathe:关于您的评论,请参阅:stackoverflow.com/questions/3008614/…
  • @Col。 Shrapnel:我会自然地和你结束这件事,说你应该在那里提供你的cmets,这样我和他的事情就会得到解决。另外,我不知道像 Dorwand 一样,您在 PHP 方面有多专业,所以您的论点也为我取消了您的 cmets。
  • @Col。弹片,@Gumbo:我已经在回答中提供了证明。您一定在 slideshare.net/thinkphp/php-53-and-php-6-a-look-ahead 看到过第 47 张幻灯片
  • @Sarfraz Ahmed:现在我很困惑,因为是您将问题标题和正文从 &lt;?= 更改为 &lt;?php=,您为什么要这样做? OP询问了&lt;?=
【解决方案2】:

与其谈论short_open_tags是否被弃用,不如谈谈使用短开放标签时的优缺点:

优势

使用短开标签&lt;?&lt;?= 分别比标准开标签&lt;?php&lt;?php echo 更短并且可能更容易编写。这在模板中直接使用 PHP 时非常方便。 (这可能也是 PHP 有alternative syntax for control structures 的原因。)

缺点

需要特定的配置

使用短打开标签时,您需要启用 short_open_tags。如果您或您的网络托管服务提供商决定禁用 short_open_tags,您的应用程序可能无法再工作,并且您可能会遇到一些严重的安全问题。因为如果 short_open_tags 被禁用,则只有标准的开始标签 &lt;?php 被识别,并且短开始标签内的所有内容都被视为纯文本。 (另请参阅 Sarfraz Ahmed 的回答中引用的 blog post。)

如果您的目标是编写不仅仅适合您的应用程序,那么此要求会使您的 PHP 应用程序的可移植性降低。这也是为什么许多人建议不要使用短的开放标签(包括 PHP 手册):

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

从 PHP 5.4 开始,&lt;?= 始终可用,无论 short_open_tags 选项如何。另一方面,&lt;? 需要启用该选项。

与 XML 处理指令冲突

另一个问题是在使用XML processing instructions 时,如&lt;?xml … ?&gt;。启用 short_open_tags 后,您不能直接在代码中使用它们,而是需要使用 PHP 来输出:

如果您想将 PHP 与 XML 结合使用,您可以禁用此选项以使用 &lt;?xml ?&gt; 内联。否则,您可以使用 PHP 打印它,例如:&lt;?php echo '&lt;?xml version="1.0"?&gt;'; ?&gt;

否则 PHP 会阻塞 &lt;?xml 中的 xml

关于弃用的最后一句话:目前 short_open_tags 未被弃用。否则手册会明确说明这一点。此外,PHP 的发明者 Rasmus Lerdorf 在reply on the question “Is it true that short_open_tag is deprecated in PHP 6?” on the internals mailing list 中写道,在 PHP 6 中不删除 short_open_tags 有几个原因:

这是我们决定不在 PHP 6 中删除它们的原因之一。

【讨论】:

    【解决方案3】:

    &lt;?= 是一个短标签,几乎等同于:

    <?php echo 
    

    从 PHP 5.4 开始,此语法始终可用,但在 PHP 的早期版本中,它需要启用 short_open_tag。至于如何在 Stack Overflow 上搜索,试试code:"&lt;?="

    【讨论】:

    • 加上要能够使用它,必须在php.ini文件中设置,所以你可能会在一些关闭了这个短标签的服务器上遇到问题。
    • @Zefiryn:还值得注意的是,它不是 PHP 5.4 的 short_tags 的一部分。希望人们将来不必担心:)
    【解决方案4】:

    这是&lt;?php echo $MAP_OBJECT-&gt;printOnLoad(); ?&gt; 的简写。当您制作基于 PHP 的模板和东西时,编写它的方法更简单。

    不过要小心。我的理解(虽然我自己从未遇到过)是速记版本可以在某些服务器上禁用。

    【讨论】:

    • 是的。他们称之为short_open_tag。详情在这里,php.net/manual/en/ini.core.php
    • 它不仅在某些服务器上关闭——默认情况下它是关闭的。所以它可能在大多数服务器上都关闭了。
    • @Frank Farmer:为了防止恼人的票,公共主机打开短标签,以及全局:-S
    【解决方案5】:

    &lt;?= 不是一回事。它实际上是 &lt;? 然后是 = 。正如@derekerdmann 所提到的,这是一个不推荐的配置。

    看看下面的内容:

    【讨论】:

      【解决方案6】:

      只是为了纠正所有这些误导性的答案:

      短开放标签不会被删除或弃用。

      【讨论】:

        【解决方案7】:

        短标签内不能这样写。

        <?=
        $number = "5";
        $sum = 15 + "5";
        ?>
        

        因为它只会将第一个输出打印为 5。

        在open标签里面你可以这样写。

        <?php
         echo $number ="5";
        echo $sum = 15+"5";
        ?>
        

        它将同时打印 5 和 20

        一切都与语法有关。

        【讨论】:

          【解决方案8】:

          由于重复问题而添加此内容

          aka shortags 是 php 的替代标签,但仅适用于启用它的服务器。

          它允许你像这样写回声

          但是不建议使用它们,并且建议在 php5.4+ 中删除或弃用它们以及注册全局变量、安全模式和魔术引号等。

          因此,尽管您可能会使用它们,但不推荐使用它们。 1. 它们不可移植,因为服务器必须启用它们。 2. 它们可以很容易地导致意大利面条代码,因为您可以轻松地将 html 集成到您的文件中。 3. 与xml声明混合使用时必须使用特殊方法

          然而,它们非常适合制作模板以及用于循环和条件检查的其他简写符号。

          【讨论】:

          • 非常正确(除了他们不打算被弃用),但它一直是pretty well covered
          • 啊。我想我是被水流卷走了。谢谢。顺便说一句,我只发布了这个,因为我输入了整个内容,然后问题就关闭了。
          猜你喜欢
          • 1970-01-01
          • 2017-01-10
          • 2016-03-20
          • 2012-03-08
          • 2011-03-10
          • 2022-12-13
          • 2018-11-18
          • 1970-01-01
          相关资源
          最近更新 更多