background image

PHP 模板引擎 Smarty 详解

Smarty 是由 Monte Ohrt 和 Andrei Zmievski 写出的 PHP 模板引擎。它不同于其

他的模板引擎,比如 FastTemplate 或者 patTemplate,其中主要原因就是 Smarty 会
将模板转化成 PHP 脚本,并剔除每次使用该模板时都会出现在解析环节里的用来控制和
错误检验的附加码。这个功能使 Smarty 在大型应用和高流量网站上有优异的表现。

Smarty 除了模板编译还有很多其他的突出特性,我们会在后面详细的讨论。首先,

我们来揭秘模板编译。 模板的编译 是什么意思?网页需要做什么样的编译?编译不是
C++和 Java 也要做吗?是的,但是这里的编译会稍有不同。

Smarty 将你的模板解析,然后转换成 PHP 脚本,而不是二进制码,像在一般的编

程中做的那样。这样,当你的网页被浏览时,Smarty 直接读取 PHP 脚本文件,而不是模
板本身,这样就节省了再次解析的时间。Smarty 在决定何时编译上也很智能,他只在你
对网页有实际的更改的时候才会重新编译,所以你不需要担心手动编译会出现问题。这样
做的好处就是你不需要了解任何关于 PHP 脚本和编码的知识。这些都是在后天操作的,
所以如果你的模板设计师甚至都不需要知道 Smarty

是一个 模板编译引擎 。

Smarty 也以自动缓存模板输出而著名。Smarty 将模板的输出内容缓存,这样就省

下了在从数据源重新取回数据时的系统支出。数据源通常都是外部的,而且很慢,所以也
经常是你的应用的瓶颈,如同远程数据源一样。Smarty 将你模板的输出连同从数据源取
得的数据一起缓存,这样并不是每次你的网页被访问时你就去连接数据源。如果你有一个
反应慢的数据源服务器或者对数据源有多种请求,这种缓存功能会大大提升网页的性能。

当然,有时你并不像让模板的输出被缓存,比如说证券报价机或者你不停的修改你

的数据源并期望立刻在网页上反应出这些变化。这些都没问题!Smarty 同样允许你定义
哪些需要缓存哪些不需要。事实上你可以将缓存和没有缓存的内容放在一个页面上,因为
Smarty 可以准确的定义什么可以被缓存(比如万年不变的导航栏)和什么不可以被缓
存(比如网页底部的证券机)。你也可以设定缓存内容的有效期,这样模板的内容只会被
缓存一段时间。这样你就可以在实时更新的大量资讯和更快速的网站体验中找到平衡。

有一点需要指出的是,这种缓存功能和 Zend Cache 或者其他的 PHP 加速器完全

不一样。类似 Zend Cache 的缓存工具都是将 PHP 脚本编译后产生的字节码缓存起来,
而 Smarty 缓存的是你的模板的输出(其实就是一种 PHP 脚本)。因此,Smarty 可以与
Zend Cache 并肩作战。通过基准测试已经发现这是一种完美的解决方案。正如引擎创作
者所说:当和 PHP 加速器一起使用时,Smarty 的表现确实有所提升。Smarty 也提供变
量修改功能。你可以把字符串大写、切割、查找和替换。

变量修改器简化了编程的过程,绕开了程序员经常使用的专业语法。这样模板设计

者就会对模板变量的格式有更好的控制,虽然他首先得知道哪些变量修改器是可用的。这
是个很有用的功能,因为句法变得简洁,而且不是程序员的人也可以使用它。Smarty 也
在你的模板中提供了很多内置的和习惯使用的函数。这些函数就像模板的应用编程接口,
除了习惯使用函数可以被修改而内置函数不能。这些函数可以让 4F60 实现条件输出(使
用 if 语句),动态循环迭代(使用 foreach 或 section 语句),读取 config 文件等等功
能。

过滤器
Smarty 可以将过滤器分类,让你可以在模板被编译之前或者之后运行过滤器。预过

滤器在你的模板运行前使用,后置过滤器在模板被编译后使用,输出过滤器会过滤模板