如何更好地使用Smarty和PHP?

8
我发现在使用Smarty和PHP时,有时需要额外的时间来:
1) 使用与PHP本身不同的语法
2) 需要检查小细节,因为文档没有提供更详细的信息,例如“转义”
http://www.smarty.net/manual/en/language.modifier.escape.php上,它没有说明escape:“引号”仅适用于双引号还是单引号,因此您需要编写代码来测试它。此外,在escape:“javascript”的情况下 - 无法确定如何以及如何进行转义。
3) 对于一些复杂的情况,需要编写辅助函数或修饰符,因此需要创建新文件,并最终在PHP中完成。
顺便问一下,使用Smarty是否比仅使用PHP提供了更好的速度?谢谢。
11个回答

23

首先,PHP是一种模板语言。在讨论为基于PHP的Web应用程序使用模板系统时请记住这一点。

我听到的唯一“真正”的使用任何模板引擎的原因是它们提供了一个更简单的语言来操作模板,如果你有不懂PHP的模板设计师,而且你不信任他们能够明智地学习使用PHP,那么这将很方便。

关于这些观点,我认为如果您的模板设计师没有足够的能力学习用于模板设计的PHP,那么您可能需要考虑找新的模板设计师。此外,PHP本身提供了一种不同的语法用于控制语句,在模板和代码中的使用可能会有所不同。例如:

<? foreach($array as $key => $val): ?>
    <?= $val ?>
<? endforeach; ?>

VS:

<?php
    foreach($array as $key => $val) {
        echo $val;
    }

?>

个人认为,模板引擎在PHP中的出现是因为:

  1. 其他语言也是这样做的
  2. 更好的PHP程序员意识到他们需要一种方式来强制分离表现层和应用层逻辑,而模板是一种简单易行的方法。

第一个原因有点儿荒谬。第二个原因可以通过一点自控力和对应用层分离的必要性的基本理解来克服。MVC设计模式是解决这个问题的一种方式。就我个人而言,我的规则是只使用必要的循环和if语句以及过滤、转义、格式化输出的函数。

经过广泛使用Smarty后,我可以诚实地说它总是给我提供了比解决方案更多的障碍。如果有什么的话,转向基于PHP的模板才是真正减少了模板和代码开发时间的。


1
+1 确实如此。顺便说一下:你的代码有一个错误:$val++ 应该改为 echo $val,以匹配第一个代码示例。 - Residuum
4
他们添加了{PHP}{/PHP}标记,这样我就可以在那里执行所有的数据库查询;) - SeanJA
1
你只是忘了提到,你不能依赖短语法,因为它很可能被禁用。所以,如果你正在开发一个严肃的项目,它不仅在你的机器上运行,那么你就必须在页面上大量使用 <?php echo $var ?>。现在,与 {$val} 相比,这看起来并不那么性感,是吧? - serg

6

我不喜欢模板引擎。我认为它们对于PHP来说非常损失和资源密集。

在MediaWiki中,在大约1.6.x版本中,我们停止默认使用Smarty,转而使用PHP内置的模板,性能显著提高。

我发现人们想要用模板系统做的大多数事情(添加链接,改变颜色,删除文本或页面的部分)使用简单的事件钩子系统更好。

Laconica,开放式微博平台,默认情况下不执行任何模板。我们有一个插件供热衷于模板的人使用。


4

Smarty无疑是最好的模板引擎之一。但在使用任何PHP模板引擎之前,人们应该更加深入地思考他们的使用情况。

首先,PHP本身就非常适合用作模板。除非您允许不受信任的用户创建或编辑模板,否则使用其他模板引擎的唯一理由是防止执行各种恶意操作。因此,如果您的项目具有用户可编辑的模板,请使用Smarty。否则,请坚持使用PHP。

如果您的问题是代码和布局的分离,我建议您考虑实现轻量级MVC风格的执行模型。或者更傲慢地说,如果您的模板中有较深的逻辑代码,则可能是时候进行一些重构了。

性能是另一个考虑因素。是的,渲染Smarty模板会带来一些成本。但完成后,输出应该被缓存,从而提高执行时间。PHP模板也是如此。通过使用其输出缓冲区,PHP允许您实现各种细粒度的缓存模型。但要注意避免过早优化:只有在代码完整且已确定实际瓶颈是什么之后才这样做!

使用Smarty或任何其他引擎的最大成本在于开发人员的时间。这是另一层复杂性,不可避免地会出现您需要“欺骗”引擎来完成您本可以一直使用纯PHP实现的操作。


3
我喜欢模板引擎并认为它们应该被使用,但在Smarty这个特定的情况下,我认为这是浪费时间,因为它并没有作为一种模板语言对PHP有重大改进:
  • 新的语法仍然基于在文档中随机插入特殊标记的旧概念。
  • 因为Smarty不理解HTML的语法/结构,所以它不能帮助您创建有效/格式良好的HTML。Smarty的标记违反了HTML的语法,因此一旦您添加了它们,其他标准工具也无法帮助您。
  • Smarty的输出,就像在PHP中一样,默认情况下是不安全的(未转义),您必须记得在输出HTML中的数据时添加|escape

有一个特定的PHP模板引擎让我爱不释手,可以解决所有这些问题:PHPTAL

虽然它仍然是您需要学习的新东西,并且是您应用程序的依赖项,但我认为解决XSS和格式不正确的问题使其值得麻烦。

PHPTAL就像Smarty一样编译一次到PHP并缓存,因此性能与原始PHP相当。


我喜欢Smarty的一件事就是过滤器,可以自动转义输出。在许多其他系统中找不到这个功能。 - I.devries
3
在我看来,这是个缺陷,因为你必须使用那个过滤器。如果你忘记了,你的输出就会变得不安全/无效。合适的模板系统应该自动进行自动转义,而不需要特殊过滤器。 - Kornel

2

优点

  • HTML文件中没有PHP代码(允许同时使用PHP和HTML缩进)
  • 管道操作符:{$var|default:"未选择"} {$var|urlencode}
  • Foreachelse语法:{foreach item=row from=$results}{$row.name}<br>{foreachelse}无结果{/foreach}
  • 可定制的网站/页面(仅使用CSS有其限制)

缺点

  • 其他语言的语法
  • 不总是很明显的代码:{"Y-m-d"|strftime:$timestamp} {$array|@var_dump}
  • 略微增加开销

我强烈推荐“模板”方法(mVc),但Smarty和纯PHP都可以胜任此任务。


1

使用Smarty作为模板引擎可能不如不使用它那么高效,因为它是一个额外的软件层,即在另一个模板语言之上的模板语言。另一方面,如果你正确地使用缓存功能,你可以实现整体性能提升。

在输出到浏览器之前,Smarty模板被预编译,这涉及将临时文件写入磁盘。这一步骤肯定会对性能造成一定的惩罚。

如果你有信心保持实现和展示的分离,并且没有对服务器端缓存产生真正的兴趣,那么你应该只使用纯PHP模板。一些MVC框架,如Zend Framework,有自己的类似PHP的模板系统。

另一方面,Smarty是强制实现漂亮的展示与实现分离的好方法,特别是在不清楚什么属于哪里的情况下。它可能有助于约束您执行这种必要分离。

话虽如此,我在大多数PHP项目中都使用Smarty,因为它让我想起了Java-Server标签库(JSTL),我非常非常习惯,并且喜欢。


1
据我所知,Smarty是速度最快的模板引擎之一。也许需要一些时间来适应它。但如果你不是独自在系统上工作,而且HTML和样式文件的数量很大,它会显著加快开发速度。
在我的最后一个项目中,设计改变了几次,但逻辑保持不变。我想这就是Smarty或任何其他模板引擎帮助很多的最好例子。

1

个人而言,我使用 Blitz 进行模板处理。在该网站上,作者声称它是最快的模板引擎,并提供了一个(有偏见的?)图表,比较了 PHP 中不同模板系统的性能。我自己没有使用过 Smarty,但这可能会给你一些关于它性能的提示。

http://alexeyrybak.com/blitz/blitz_en.html


0

使用Smarty或不使用它,更多的是一种哲学立场。

我使用它,尽管我没有使用太多功能。以这种方式使用,模板往往非常简单。传递一个带有参数的关联数组,遍历其组件并在结果页面中插入所需元素。这样可以保持模板干净,并且(希望)没有业务逻辑。

此外,扩展Smarty非常简单。

例如,我添加了一个styles参数到fetch()中,以实现fetchUsingStyle()。这使我可以轻松地在不同的站点布局之间切换。

此外,我的fetchUsingStyle()会搜索各种位置的模板:首先尝试找到当前样式。如果未找到,则尝试使用默认样式加载模板。最后,它会尝试定位一个纯静态虚拟文件,作为稍后要实现的占位符。


0
尝试在MVC模式中使用Smarty,例如CodeIgniter,比核心PHP更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接