7

我发现在 PHP 中使用 Smarty,有时需要额外的时间用于

1) 使用与 PHP 本身完全不同的语法
2) 需要检查小案例,因为文档没有提供更详细的信息,例如“转义”

http://www.smarty.net/manual/en/language.modifier.escape.php

它没有说 escape:"quotes" 仅用于双引号或单引号,因此您需要编写代码来测试它。同样对于 escape:"javascript" 的情况——不能准确地告诉它是什么以及它是如何被转义的。

3)对于一些复杂的事情,需要编写辅助函数或修饰符,因此需要创建新文件并最终在 PHP 中完成。

顺便说一句,与单独使用 PHP 相比,使用 Smarty 是否提供了很好的加速?谢谢。

4

11 回答 11

22

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

我听说过使用任何模板引擎的唯一“真正”的论点是,它们为模板操作提供了一种更简单的语言,如果你的模板设计师不了解 PHP 并且你不信任他们,这会很方便学会明智地使用 PHP。

关于这些论点,我认为如果您的模板设计师没有能力学习足够的 PHP 进行模板设计,您可能应该考虑寻找新的模板设计师。此外,PHP 本身为您可能在模板和代码中使用的控制语句提供了不同的语法。例如:

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

对比:

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

?>

就个人而言,我相信模板引擎出现在 PHP 中是因为:

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

第一个原因有点傻。第二个原因可以通过一点点自我控制来克服,甚至对应用程序中分离层的必要性有一个基本的了解。MVC 设计模式是解决这个问题的一种方法。至于锻炼一些自我控制,我的规则是只使用必要的循环和 if 语句以及过滤、转义、格式化屏幕输出的函数。

在广泛使用 Smarty 之后,老实说,它总是给我带来比解决方案更多的障碍来克服。如果有的话,切换到基于 PHP 的模板实际上减少了模板和代码的开发时间。

于 2009-05-17T16:51:06.220 回答
6

我不喜欢模板引擎。我发现它们对于 PHP 来说非常有损且资源密集。

使用 MediaWiki,在 1.6.x 版本左右,我们默认放弃使用 Smarty,只使用 PHP 的内置模板,性能有了很大提高。

我发现人们想要用模板系统做的大部分事情(添加链接、更改颜色、删除页面的文本或部分)最好用一个简单的事件挂钩系统来完成。

Laconica 是开放的微博平台,默认不做任何模板。我们为喜欢模板的人准备了一个插件。

于 2009-05-17T16:54:39.930 回答
4

Smarty 无疑是目前最好的模板引擎之一。根据我的经验,尽管人们最好在使用 PHP 之上的任何模板引擎之前更彻底地考虑他们的用例。

首先,PHP 本身非常适合模板。几乎使用另一个模板引擎的唯一理由是,如果您允许不受信任的用户创建或编辑模板,因为他们可能会执行各种错误。因此,如果您的项目有用户可编辑的模板,请使用 Smarty。如果没有,请坚持使用 PHP。

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

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

使用 Smarty 或任何其他引擎的最大成本来自于开发人员的时间。这是另一层复杂性,您不可避免地会发现自己处于必须欺骗引擎执行您在纯 PHP 中一直可以完成的事情的情况下。

于 2009-05-17T16:45:21.293 回答
3

我喜欢模板引擎并认为应该使用它们,但在 Smarty 的特殊情况下,我认为这是浪费时间,因为它不是 PHP 作为模板语言的显着改进:

  • 新语法仍然基于插入文档中随机位置的特殊标签的旧概念。
  • 因为 Smarty 不了解 HTML 的语法/结构,所以它不能不帮助您创建有效/格式良好的 HTML。Smarty 的标签违反了 HTML 的语法,所以一旦你添加了它们,其他标准工具也帮不了你。
  • Smarty 的输出,就像在 PHP 中一样,默认情况下是不安全的(未转义的),您必须记住|escape在以 HTML 格式输出数据的任何地方添加。

我爱上了一个特定的 PHP 模板引擎,它解决了所有这些问题:PHPTAL

它仍然是你必须学习的新东西,并且它对你的应用程序来说是一种依赖,但我认为解决 XSS 和格式错误的问题会让你觉得麻烦。

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

于 2009-05-17T16:41:41.200 回答
2

优点

  • HTML 文件中没有 PHP(允许 PHP 和 HTML 标识)
  • 管道 {$var|default:"None selected"} {$var|urlencode}
  • Foreachelse:{foreach item=row from=$results}{$row.name}<br>{foreachelse}没有结果{/foreach}
  • 可主题化的网站/页面(仅使用 CSS 有限制)

缺点

  • 其他语言语法
  • 并非总是显而易见的代码 {"Ymd"|strftime:$timestamp} {$array|@var_dump}
  • 轻微开销

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

于 2009-05-18T18:48:52.933 回答
1

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

Smarty 模板在输出到浏览器之前会进行预编译,这涉及将临时文件写入磁盘。这一步肯定会惩罚性能,至少是一点点。

如果您对保持实现和表示分离的能力充满信心,并且对服务器端缓存没有真正的兴趣,那么您可能应该只使用纯 php 模板。一些 MVC 框架(例如Zend Framework )有自己的类似 PHP 的模板系统。

另一方面,smarty 是一种将表示与实现巧妙分离的体面方法,尤其是在不清楚什么属于哪里的情况下。它可能有助于训练你强制执行这种必要的分离。

也就是说,我在我的大部分 PHP 项目中都使用 Smarty,因为它让我想起了 Java-Server Tag Libraries (JSTL),我非常非常习惯并喜欢它。

于 2009-05-17T16:20:15.973 回答
1

据我所知,Smarty 是速度方面最好的模板引擎之一。也许需要一段时间才能习惯。但是,如果您不是单独在系统上工作,并且 html 和样式文件的数量很大,那么它会显着加快开发速度。

在处理我的上一个项目时,设计更改了几次,但逻辑是相同的。我想这是 Smarty 或任何其他模板引擎有很大帮助时的最佳示例。

于 2009-05-17T16:26:22.573 回答
1

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

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

于 2009-05-17T16:37:28.393 回答
0

是否使用 Smarty 或多或少是一种哲学立场。

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

此外,扩展 Smarty 非常简单。

例如,我在 fetch() 中添加了一个样式参数以具有 fetchUsingStyle()。这让我可以很容易地在网站的不同布局之间切换。

此外,我的 fetchUsingStyle() 在不同位置搜索模板:首先尝试查找当前样式。如果未找到,它会尝试使用默认样式加载模板。最后,它试图定位一个纯静态的虚拟文件,一个占位符,用于稍后实现的某些东西。

于 2011-02-16T00:36:39.457 回答
0

尝试将 Smarty 与 MVC 模式一起使用,例如 Codeigniter,它比核心 PHP 更好

于 2012-10-09T12:27:12.210 回答
-1

当您可以只使用 html 文件并在需要的地方注入 php 代码时,为什么还要使用模板引擎?你可以用 Psttt 做到这一点!php的模板引擎

完整的源代码在这里http://github.com/givanz/psttt

于 2010-09-19T19:11:14.907 回答