【问题标题】:Why do almost all PHP framework use "<?php echo ... ?>"为什么几乎所有 PHP 框架都使用“<?php echo ... ?>”
【发布时间】:2011-01-18 15:57:00
【问题描述】:
  • PHP 短标签 &lt;?= $var ?&gt;弃用一段时间。
  • 几乎所有 PHP 框架 使用长格式 &lt;?php echo $var ?&gt;(例如,symphonyYiiKohana
  • Smarty 是一个著名的 PHP 模板引擎,它支持更短的形式 {$var}
  • 模板引擎(如 Smarty)对于网页设计师来说更容易
    • 编辑模板会显示{$var} 而不是什么都不显示(因为&lt;..&gt;
    • 更短的语法(减少输入,尤其是当&lt;&gt; 在某些键盘布局上的同一个键上时)
    • 模板经过预编译和缓存,提供几乎相同的性能

所有这些都让我想知道,为什么所有框架似乎都使用超长的 PHP 语法?不使用像 Smarty 这样的模板引擎有什么优点(除了小开销)?

【问题讨论】:

  • CodeIgniter 怎么样? codeigniter.com/tutorials/watch/intro
  • 为什么说smarty对设计师来说更容易?你见过一个成熟的 smarty 模板吗?我有,而且很烂!!我没看懂,设计师也没看懂
  • 这与 PHP 短标签与长标签无关。 Smarty3 也非常快,真的。对于大多数人来说,开销可以忽略不计。我相信这里已经忘记了一个论点。首先,Smarty3 支持模板继承之类的东西,其次,当在浏览器中“预览”模板时,您会看到 {$description} 显示,而如果您使用 PHP &lt;?...?&gt;,您看不到任何内容。这也有助于验证 PHP(直接在 HTML 编辑器中)。我不是说要推动 Smarty3,只是为了指出我的奇迹。到目前为止给出的最佳理由是更加灵活并且可以轻松实施。
  • @AntonioCS 根据我的经验,Smarty 让事情变得更容易,因为您只需要处理显示和格式设置,而不是让大量不相关的 PHP 弄乱页面。
  • @abeger:有了好的设计,你不会有“很多不相关的 PHP 使页面混乱”。如果您在模板中包含应用程序逻辑,那么无论您使用什么语言/框架,您都做错了。

标签: php templates frameworks smarty php-shorttags


【解决方案1】:

关于 PHP 的问题在于它已经 一种模板语言。

Smarty,尽管它很好,但增加了开销。如果您没有充分的理由使用它,那您为什么要使用它?使用后端框架的人是已经熟悉 PHP 的开发人员,因此没有理由让他们使用具有新语法的模板引擎来学习它。

大多数框架都足够灵活,添加模板引擎并不需要太多工作。如果构建的框架迫使您使用 Smarty,那么它就会变得不那么受欢迎,因为框架本身的灵活性会降低。

关于“长语法”,没有框架会因安全问题而对已弃用的语法束手无策。框架的用户是否愿意使用它可以留给框架的用户(现在应该没有人应该这样做),但是围绕短标签构建一个核心框架会降低它的可移植性。

【讨论】:

  • 那篇文章准确地说明了我的观点。作者主要抱怨语法冗长/冗长,可读性差。对于大多数习惯该语言的 PHP 开发人员来说,这不是一个大问题。为什么要增加另一层复杂性来解决本质上非问题?我认为最好用文章中的这句话来概括:“但是当你想要做的主要是编写模板时,这些增强是无关紧要的。”您主要编写模板的项目有多少?如果这就是你所做的,那么是的,考虑一个模板引擎。否则,没有太大的推动力。
  • “对于大多数习惯了该语言的 PHP 开发人员来说,这不是一个大问题。为什么要添加另一层复杂性来解决本质上不存在的问题?”- 这就是确切的原因。使用模板的人不会是程序员。
【解决方案2】:

我不知道我会调用&lt;?php print $foo; ?&gt;“超长语法”。

事实上,短标签并不总是在服务器上启用,而标准默认设置通常是启用的。走那条路比较安全。

【讨论】:

    【解决方案3】:

    像 Smarty 这样的模板引擎添加了一个不需要的额外处理层 - 它们大多是英国媒体报道软件。他们通常会添加太多额外的处理来达到语法糖的水平。当完整的 PHP 标签可用时使用模板引擎就像戴上枷锁一样——它变成了另一种语言,它有自己的怪癖来学习,以便用普通的 PHP 完成同样的事情。

    根据我的经验,我很少看到非程序员完全或轻松地使用模板引擎。举这两个例子:

    聪明的:

    <select>
    {foreach from=$k item=v}
     <option value="{$v.value|escape:'html'}">{$v.label|escape:'html'}</option>
    {/foreach}
    </select>
    

    PHP:

    <select>
    <?php foreach ($k as $v) { ?>
     <option value="<?php echo htmlentities($v['value']); ?>"><?php echo htmlentities($v['label']); ?></option>
    <?php } ?>
    </select>
    

    现在,Smarty 的语法可能会稍微干净一些 - 但老实说,除了之外的任何一个程序员都能够轻松地使用任一代码集吗?模板引擎添加了额外的处理/逻辑层,但没有提供任何主要好处。

    【讨论】:

    • Precisely Smarty 并没有让它更清晰。 PHP 代码与 smarty 代码一样简单。忠于php!!
    【解决方案4】:

    这是 Symfony 框架的 Fabien Potencier has to say about templating engines

    为什么人们仍然认为 PHP 是一个 模板引擎?果然,PHP 作为模板开始了它的生活 语言,但它并没有像 近几年的一个。如果你认为 PHP 还是模板语言,可以 你只给我一个最近的变化 将 PHP 增强为的 PHP 语言 模板语言?我想不出 一个。

    他还描述了他在模板语言中寻找的功能:

    • 简洁
    • 面向模板的语法
    • 可重用性
    • 安全性
    • 沙盒模式

    以及使他最喜欢的模板语言Twig 脱颖而出的一些功能:

    • 本机模板继承(模板编译为类);
    • 可靠的自动自动转义(没有关联的运行时开销,因为 一切都在 编译);
    • 非常安全的沙盒模式(将标记、过滤器和方法列入白名单 可以在模板中使用);
    • 出色的可扩展性:您可以通过以下方式覆盖所有内容,甚至是核心功能 将您自己的标签和过滤器捆绑为 扩展;但你也可以 操纵 AST(抽象语法 树)在编译之前。经过 利用这种可能性,您可以 甚至创建自己的 DSL(域 特定语言),针对您的 申请。

    在文章的 cmets 中,他说,“它可能会成为 Symfony 2 的一部分。但我首先需要一些社区反馈。”

    阅读the full article,了解他支持模板系统的全部论点。

    【讨论】:

    • 为什么你会看到这么多开销?一旦编译,它就像 PHP 一样。它只编译一次。如果您正在考虑包含和读取文件的数量,请再想一想:Smarty3 比 Smarty2 包含的文件要快得多。
    【解决方案5】:

    有一些原因:

    • 出于安全考虑,它们将从 php 的未来版本中弃用。
    • 一些主机禁用它们。

    更多:

    Are PHP short tags acceptable to use?

    不推荐它们,因为它是 PITA 如果你不得不移动你的 代码到它不是的服务器 支持(并且您无法启用它)。 正如您所说,许多共享主机都可以 支持短标签,但“很多”不是全部 其中。如果你想分享你的 脚本,最好使用完整的 语法。

    我同意

    我不买可读性作为理由 全部。大多数认真的开发人员都有 语法高亮选项 可供他们使用。

    更多

    http://terrychay.com/article/short_open_tag.shtml

    【讨论】:

    • 我工作的公司敦促我们不要再使用短标签,因为他们被告知有些网站因为使用短标签而被发现易受攻击,所以我们停止使用它们。黑客可以就其背后的原因给出最佳答案,但是,您也可以在 google 上找到有关它的更多信息。
    • “图片可以用来嵌入那些标签……”你能详细说明一下吗?
    • @deceze:请看这个:phpclasses.org/blog/post/…
    • @Sarfraz 哪里提到了与短标签相关的安全问题?这听起来很有趣。
    • @Sarfraz 链接的问题与使用短打开标签无关。不过很有趣。
    【解决方案6】:

    短开标签已被弃用,它们也将在 PHP6 中被删除。

    链接的文章还包含有关该主题的许多有用信息。

    引用Rasmus Lerdorf(第三个链接):

    我看到的大多数论点基本上都在说&lt;? 是邪恶的,它甚至不应该存在,但这不是当前的问题。它确实存在,我们不会删除它,所以这里唯一真正的论点是代码引入的 WTF 因素,它能够动态启用或禁用这些标签。这是我见过的唯一有效的论点。是否可以使用 xmllint 验证 PHP 代码以及 &lt;? 是否是有效的 xml(显然不是)完全无关紧要。我们都知道,当您使用&lt;? 时,您不符合 XML。对于绝大多数人来说没关系。 […]

    我的观点是人们想要模板。尽管我讨厌这个概念,并且一直对此非常直言不讳,但人们想要更简单的模板标签。他们甚至会在每个请求上解析文件并生成 PHP 代码,以便使用 {blah} 而不是 &lt;?php blah() ?&gt;。人们愿意为语法糖带来一个数量级的性能损失这一事实让我感到困惑,但只要看看那里的所有模板系统。是的,我知道使用模板还有其他原因,例如限制不受信任的模板编写者的功能集等,但是您会惊讶于有多少人只想少打字并让他们的标签更漂亮。在我的书中,让这些人切换到&lt;?blah()?&gt; 是性能和理智的胜利。是的,这不是一场全面的胜利,但仍然是一场胜利。


    就我个人而言,我尽量避免使用模板系统,因为我发现常规 PHP 语法更容易用作模板语言,它重新发明了 PHP 开箱即用的功能。添加 ViewHelpers 后,任何设计人员在使用常规语法时都不会遇到太多麻烦。实际上,我一直认为,模板引擎(如Smarty)对于网页设计师来说更容易相当贬低。冗长的 PHP 语法在美学上可能不吸引人,但任何半脑都可以学会。

    【讨论】:

      【解决方案7】:

      因为他们不想包含像 Smarty 这样庞大的库来缩短他们的模板几个字符。

      【讨论】:

        【解决方案8】:

        除了其他答案之外,还有几件事使 Smarty(和类似的模板引擎)存在问题。

        首先,如果要在模板中放入 javascript,则需要对模板中的某些字符进行转义。如果你的 javascript 是由 PHP 动态创建的,那就更糟了;该代码的可读性急剧下降。

        第二个也是最重要的一点是,当您在一个体面的 OO 框架中工作时,Smarty 会严重降低您代码的功能。使用 PHP 作为模板引擎时,您可以在模板中使用 $this 来调用解析模板的控制器中的方法。不仅如此,您还可以访问控制器继承的所有方法。 使用 smarty,您将失去整个功能,因为 $this 不再引用您的控制器。本质上,您不能从模板访问整个框架,而只能访问 Smarty 的有限功能。

        【讨论】:

        • Smarty3 改进了很多。我有很多 JavaScript 转义,但不是我没有一个。至于暴露您的网站库,我会说这是一个坏习惯。模板应该尽可能简单,所有内容都通过控制器准备。以后必须更容易重构。
        猜你喜欢
        • 2021-04-14
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 2011-09-04
        • 2012-01-08
        • 2018-11-22
        • 1970-01-01
        相关资源
        最近更新 更多