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

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

4

8 回答 8

15

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

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

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

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

于 2010-02-19T06:36:27.420 回答
10

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

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

于 2010-02-19T06:32:05.897 回答
9

像 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 语法可能稍微干净一些——但老实说,除了程序员之外的任何人都能够舒适地使用任一代码集吗?模板引擎添加了额外的处理/逻辑层,但没有提供任何主要好处。

于 2010-02-19T06:41:11.287 回答
5

以下是 Symfony 框架的 Fabien Potencier对模板引擎的评价:

为什么人们仍然认为 PHP 是一个模板引擎?果然,PHP 是作为一种模板语言开始它的生命的,但它并没有像最近几年那样发展。如果你认为 PHP 仍然是一种模板语言,你能告诉我 PHP 语言最近的一个变化,它增强了 PHP 作为一种模板语言吗?我想不出一个。

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

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

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

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

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

阅读全文以获得他支持模板系统的全部论点。

于 2010-02-19T08:37:54.117 回答
3

有一些原因:

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

更多的:

可以使用 PHP 短标签吗?

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

我同意

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

更多的

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

于 2010-02-19T06:28:58.600 回答
3

短的开放标签被弃用,它们也不会在 PHP6 中被删除。

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

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

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

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


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

于 2010-02-19T08:20:24.250 回答
2

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

于 2010-02-19T06:34:04.967 回答
2

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

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

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

于 2010-02-19T09:02:37.833 回答