为什么几乎所有的PHP框架都使用“<! - ?php echo ...? - >”

时间:2010-02-19 06:25:35

标签: php templates frameworks smarty php-shorttags

  • PHP短标记<?= $var ?>已被弃用一段时间。
  • 几乎所有 PHP框架 都使用长格式 <?php echo $var ?>(例如,symphonyYiiKohana
  • Smarty是一个着名的PHP模板引擎,它支持更短的{$var}
  • 形式
  • 模板引擎(如 Smarty )对于网页设计师来说更容易
    • 修改模板会显示{$var},而不会显示任何内容(因为<..>
    • 缩短语法(减少输入,尤其是当<>在某些键盘布局上的同一个键上时)
    • 模板经过预编译和缓存,提供了几乎相同的性能

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

8 个答案:

答案 0 :(得分:15)

关于PHP的事情是它已经 是一种模板语言。

Smarty,虽然它很好,却增加了开销。如果你没有充分的理由使用它,那你为什么要这样做?使用后端框架的人是熟悉PHP的开发人员,因此没有理由让他们使用带有新语法的模板引擎来学习它。

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

关于“长语法”,没有任何框架会对具有安全性问题的弃用语法挂起。它可以留给框架的用户,如果他们想要使用或不使用(现在没有人应该使用),但围绕短标签构建核心框架会降低其可移植性。

答案 1 :(得分:10)

我不知道我会称<?php print $foo; ?>为超长语法。“

事实是,短标签并不总是在服务器上启用,而标准默认值通常是。这条路线更安全。

答案 2 :(得分:9)

像Smarty这样的模板引擎增加了一个不需要的额外处理层 - 它们主要是英国媒体报道。它们通常会添加太多额外的处理,以达到语法糖的含量。当完整的PHP标签可用时使用模板引擎就像戴着镣铐 - 它成为另一种语言,它有自己的怪癖要学习,以便用普通的PHP完成同样的事情。

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

Smarty的:

<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语法可能稍微清晰一点 - 但老实说,除了以外,是否有任何人程序员能够轻松地使用任何代码集?模板引擎添加了额外的处理/逻辑层,而没有提供任何重大好处。

答案 3 :(得分:5)

以下是Symfony框架的has to say about templating engines的Fabien Potencier:

  

为什么人们仍然认为PHP是一个   模板引擎?果然,PHP   作为模板开始了它的生命   语言,但它没有发展成像   一个在最近几年。如果你认为   PHP仍然是一种模板语言,可以   你最近给我一个改变   增强PHP的PHP语言   模板语言?我想不出来   之一。

他还用模板语言描述了他所寻找的功能:

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

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

  
      
  • 本机模板继承(模板编译为类);
  •   
  • 固定自动自动转义(没有相关的运行时开销)   一切都在期间完成   汇编);
  •   
  • 非常安全的沙盒模式(白名单列表,过滤器和方法   可用于模板);
  •   
  • 极佳的可扩展性:您可以覆盖所有内容,甚至是核心功能   将您自己的标签和过滤器捆绑为   延期;但你也可以   操纵AST(抽象语法   树)编译之前。通过   利用这种可能性,你可以   甚至创建自己的DSL(域名   具体语言),针对你的   应用
  •   

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

阅读the full article以使他的整个论点更有利于模板系统。

答案 4 :(得分:3)

有一些原因:

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

更多

<强> Are PHP short tags acceptable to use?

  

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

     

我同意      

我不把可读性作为理由   所有。最认真的开发者有   语法高亮选项   可供他们使用。

更多

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

答案 5 :(得分:3)

短暂打开的代码已弃用,并且在PHP6中也会删除

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

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

  

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

     

我的观点是人们想要模板化。尽管我讨厌这个概念,并且一直非常直言不讳,但人们想要更简单的模板标签。他们甚至可以解析文件并在每个请求上生成PHP代码,以便使用{blah}而不是<?php blah() ?>。事实上,人们愿意采取一个数量级的性能打击语法糖是令我困惑的,但只是看看那里的所有模板系统。是的,我知道还有其他原因可以使用模板,例如限制不受信任的模板编写器的功能集等等,但是你会惊讶地发现有多少人只想输入更少的内容并让他们的标签更漂亮。让这些人切换到<?blah()?>是我书中表现和理智的胜利。是的,这不是一个完整的胜利,但它仍然是一个胜利。


就个人而言,我试图避免使用模板系统,因为我发现常规的PHP语法更容易用作模板化语言,它重新发明了PHP可以开箱即用的功能。通过添加ViewHelpers,任何设计人员都不应该使用常规语法。实际上,我总是发现这个论点,模板引擎(比如Smarty)更容易让网页设计师贬低。详细的PHP语法可能不具有美学吸引力,但任何半脑都可以学习它。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

除了其他答案之外,还有一些事情会让Smarty(和类似的模板引擎)出现问题。

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

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