`
xubaoguo
  • 浏览: 79433 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模板引擎Smarty介绍

阅读更多

用PHP实现MVC开发模式的逻辑层和表示层有多种模板引擎可供选择,但是官方引擎SMARTY诞生后,选择就有了变化。它的理念和实现都是相当" 前卫"的。本文主要讨论SMARTY之于其他模板引擎的不同特点,简要介绍了该引擎的安装及使用,并用一个小的测试案例对比了SMARTY和PHPLIB template的速度和易用性。

一、MVC需要模板

MVC最早是在SmallTalk语言的开发过程中总结出的一种设计模式,MVC分别代表了"模型"、"视图"和"控制",目的就是让不同的开发角色在大中型项目中各司其职。在网络应用程序的开发中,可以用下图来表示各概念之间的关系。

该图展示了一个简单的WEB应用程序,用户在浏览器上看到信息是数据库服务器上的内容,但在这之前经过了应用服务器加工。开发人员负责的就是建立数据结构、处理数据的逻辑以及表示数据的方法。

96年CGI在中国开始流行的时候,早期的WEB程序员都是从HTML开始自学成材的,在PERL中print一行行的HTML并不是一件难事,但 是随着网络的一步步提速,页面大小也从当初的二、三十K暴涨了十倍。写CGI程序就产生了一个迫切的要求:分开PERL和HTML源码。于是,社会进步体 现在开发小组内部的分工上。由于美工和程序员对互相的工作并不是十分熟悉,在进行合作的过程中需要用一种约定的"语言"进行交流。

这种语言并不是我们的母语或者英语,术语叫做"模板 ",逻辑和表示依靠它联系。它是结合了HTML和脚本语言特征的一种表达方式。通 过这种方式,表示层可以按照用户所希望的格式来显示经过逻辑层处理过的数据。如果你有Windows平台下MFC的开发经验,那么一定会很熟悉 Document/Document Template/View的封装,这就是一个很典型的MVC例子。对于Web应用来说,个人认为J2EE中的EJB/servlets/JSP是最强大 的,当然还有简洁优美的Structs。另一个很有名的实现就是COM/DCOM+ASP,这个组合在我国是最多人使用的。

通过几种MVC实现在WEB应用程序里的对比,可以得到一个关于模板的概念:一组插入了HTML的脚本或者说是插入了脚本HTML,通过这种插入的内容来表示变化的数据。下面给出一个模板文件的例子,这个模板经过处理后在浏览器里显示"Hello, world!"

<html>

<head>
      <title>$greetings</title>
   </head>
   <body>
      $greetings
   <body>
</html>

这里暂且省略处理方式,在后面做专门对比讨论。

二、为什么选SMARTY?

对PHP来说,有很多模板引擎可供选择,比如最早的PHPLIB template和后起之秀Fast template,经过数次升级,已经相当成熟稳定。如果你对目前手中的模板引擎很满意,那么......也请往下看,相信你作为一个自由软件爱好者或者 追求效率和优雅的开发者,下面的SMARTY介绍多少会有点意思。

除了个人偏好的影响,我一直倾向于使用官方标准的实现,比如APACHE的XML引擎Axis。好处就是可以获得尽可能好的兼容性(比如早期MFC 对于Win3x的兼容性就比其它的应用程序框架好,当然现在各种版本都很完善了)。SMARTY发布之前我一直使用的是 PEAR 中的Integrated Template eXtension。这个引擎和PHPLIB template、Fast template几乎是兼容的,从模板的语法到对模板的处理同出一辙:都是将模板读入内存然后调用parse()函数,用数据对预置的标记进行替换。

下面看看SMARTY是怎么做的。接到request后,先判断是否第一次请求该url,如果是,将该url所需的模板文件"编 译"成php脚本,然后redirect;如果不是,就是说该url的模板已经被"编译"过了,检查不需要重编译后可以马上redirect,重编译条件 可以自己设定为固定时限,默认的是模板文件被修改。   

怎么样,看起来是不是有点眼熟?想起来了──这不就是JSP的原理嘛!的确,这种"编译"用在PHP这样的解释性脚本引擎上显得匪夷所思,但是仔细想想,JAVA不也是由JVM解释执行的吗?这就叫"没有做不到,只有想不到"。

既然谈到了JAVA,就再对PHP的未来发表一点看法。PHP官方网站上宣布了要在2003年年底发布PHP5.0版。这个版本拥有很多崭新的特 性:比如异常处理,命名空间,更加面向对象等等。可以说越来越向JAVA靠拢,SMARTY也是新特性之一,使得PHP更适用于大中型项目的开发。但是似 乎离我当初选择它的原因──灵巧易用──越来越远了。但就一个软件的生存周期来看,PHP正处在成长期,开发者赋予它更多的功能,以期能胜任商业应用是利 大于弊的。作为PHP的忠实用户,肯定不希望PHP总是被人指责"能力不足"吧?

为什么选择SMARTY,仅仅因为它很像JSP?当然有更为充分的理由。首先,除了第一次编译的成本比较高之外,只要不修改模板文件,编译好的 cache脚本就随时可用,省去了大量的parse()时间;其次SMARTY像PHP一样有丰富的函数库,从统计字数到自动缩进、文字环绕以及正则表达 式都可以直接使用;如果觉得不够,比如需要数据结果集分页显示的功能,SMARTY还有很强的扩展能力,可以通过插件的形式进行扩充。

事实胜于雄辩。我设计了一个测试程序,通过速度和开发难度这两个因素对比了一下SMARTY和PHPLIB template,选PHPLIB template的原因是在patrick的文章 《在PHP世界中选择最合适的模板》中有一个PHPLIB template对Fast template的竞赛,结果PHPLIB template大获全胜,这使得SMARTY有了一个很好的对手。在测试之前,先谈一下在安装过程中需要注意的问题。

 


三、可能遇到的问题

在SMARTY的 官方网站上,有详尽的用户手册,可以选择在线HTML和PDF格式的版本。这里就不再涉及手册上已有的内容,只是把初次使用可能遇到的问题做个解释。

第一个问题就很要命:提示说找不到所需文件?并不是每一个人都按照SMARTY默认目录结构来写应用的。这里需要手工指定,假设目录结构如下:

就需要在index.php里指定目录结构:

$smart->template_dir = "smarty/templates/";
$smart->compile_dir = "smarty/templates_c/";
$smart->config_dir = "smarty/configs/";
$smart->cache_dir = "smarty/cache/";

第一个问题解决了,紧接着就是第二个:我刚用Dreamweaver生成的漂亮模板怎么不能用?并不是模板文件有什么问题,而是因为SMARTY默认的标记分隔符是{},不巧的是Javascript肯定包含这个标记。好在我们可以用任意字符当作分隔符,再加上这两句:

$smart->left_delimiter = "{/";
$smart->right_delimiter = "/}";

这下安装就基本完成,没问题了。

四、反衬和类比

先构思一下对测试的设计。主要的评比因素当然是速度了。为了进行速度测试,采取了算术平均数的作法。在测试页面中重复将页面生成N遍,再对比总页面 生成时间。另一个重要因素是易用性(至于扩展性不用比较已经有结果了),所以使用的模板不能太小。我用的是我个人主页的的页面,一个用 Firework+Dreamweaver生成的HTML文件,大小约7K。其中的变量设置也采取最常用的区块,在PHPLIB template里叫block,而SMARTY则称section。别小看这称呼的不同,易用性标准分两块:模板文件和脚本文件的语法是否简明易用。

下面就深入到测试中来。先看看两种模板文件的语法:蓝条左边是PHPLIB template的模板,右边属于SMARTY。个人偏好是不一样的,所以这里不作评论。着重对比一下脚本里的处理语句,先看PHPLIB template的:

$tpl->set_file('phplib', 'bigfile.htm');
$tpl->set_block('phplib', 'row', 'rows');
for ($j = 0; $j < 10; $j++){
        $tpl->set_var('tag' ,"$j");
        $tpl->parse('rows', 'row', true);
}
$tpl->parse('out', 'phplib');
$tpl->p('out');

下面是SMARTY的:

$smart->assign('row',$row);
$smart->display('bigfile.htm');

SMARTY只用了tags和row两个变量,而PHPLIB template则多了模板文件的handler,还有一个莫名其妙的out。说实在的这个out我当初学的时候就不知道为什么要存在,现在看起来,还是 别扭。为什么SMARTY少那么多处理语句呢?答案是工作由引擎完成了。如果你喜欢钻研源程序,可以发现在 Smarty_compiler.class.php里有一个名叫_compile_tag()的函数,由它负责把section这个标签转换成php语 句。这不是一个普通的标签,它带有参数和数据,节省了脚本编程的工作量,而模板标签上的工作量相差又不大,可以判定在易用性上SMARTY高出一畴。

下面该轮到我们最关注的速度了,毕竟对于一个熟练的web开发者来说,掌握再困难的工具不过是时间问题,何况模板引擎这种学习曲线平缓的技术。而速 度则是web应用程序的生命,尤其是模板引擎使用在并发访问量很大的站点上,这点就更重要了。测试开始前,我觉得PHPLIB template会在这一环节上胜出,因为它经历了很多次升级,已经基本没有什么bug,而且SMARTY的引擎个头太大,不像它的对手只有两个文件。

果然,测试结果如下图,PHPLIB template有25%的速度优势:

但不会一直这样,我又按了一次刷新,这次得到了不一样的结果:

PHPLIB基本没变化,但是SMARTY提高了25%的速度。继续刷新,得到的都是类似于第二次的结果:SMARTY比PHPLIB template 快上近10%。我想这就是编译型比解释型快的原理了。SMARTY引擎本身就很大,加上还要把模板编译成php文件,速度当然比不上小巧的PHPLIB template。但这只是第一次的情况。第二次接到请求的时候,SMARTY发现该模板已经被编译过了,于是最耗时的一步被跳过了,而对手还要按部就班 地进行查找和替换工作。这是编译原理里讲到的很经典的"用空间换时间"例子。

五、结论

结论就是如果你已经爱上SMARTY了,那么还等什么呢?当然并不是说它就全能,就如同我用MVC模式来写我的个人网站,非但没有减少工作量,反而总是要为不同层次间的耦合劳神。

SMARTY不适合什么呢?举个手册里的经典例子:天气预报网站。我还想到一个:股市大盘。在这种网站上用SMARTY会由于经常的重编译而效率偏低,还是PHPLIB template更为适合。

本文并不是为了对比两种引擎,而是为了说明SMARTY的优势。使用它最有意义之处在于它是PHP新体系的一部份,作为一支独立的力量,除 了.NET和JAVA ONE这两大体系之外,大中型web开发还有别的选择。这对于GNU项目来说,其意义无异于刘邓大军千里跃进大别山。

 

分享到:
评论

相关推荐

    (第27讲) PHP模板引擎Smarty入门使用

    Smarty介绍及其优缺点 **Smarty** 是一个强大的PHP模板系统,它通过引入模板和业务逻辑的分离,提高了代码的可维护性和开发效率。主要优点包括: - **清晰分离**:将PHP代码与HTML模板分开,使得前端设计师和后端...

    (第29讲) PHP模板引擎Smarty内置函数

    在PHP开发中,模板引擎是一种将业务逻辑与视图展示分离的重要工具,Smarty就是其中一款广泛应用的PHP模板引擎。本讲主要围绕Smarty的内置函数展开,涵盖了数组处理、多文件包含、条件判断以及文本处理等核心功能。 ...

    Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。

    Smarty模板引擎是一款专门为PHP开发的模板技术框架,其核心设计理念在于实现前端展示(视图)与后端逻辑(控制器和模型)的分离,使得开发者能够更专注于设计和业务处理,而不是将两者混淆在一起。作为业界知名的PHP...

    smarty模板引擎教程

    这个教程将深入讲解Smarty模板引擎的基本概念、安装、配置、语法以及在实际项目中的应用。 1. **Smarty模板引擎的基本概念** Smarty是一种服务器端的模板引擎,它允许开发者使用简单的HTML模板语言来编写界面,...

    模板引擎-Smarty.doc

    Smarty模板引擎从安装到结合php的使用, 从基础到深入

    php模板引擎smarty

    通过以上介绍,我们可以看到Smarty作为PHP模板引擎,为Web开发带来了很多便利。它提高了代码的可读性和可维护性,促进了团队协作,特别是对于那些前后端分工明确的大型项目,Smarty更是不可或缺的工具。同时,通过其...

    php模板引擎Smarty学习笔记(全)

    Smarty是一个在PHP中广泛使用的模板引擎,它的设计目标是将呈现逻辑与业务逻辑分离,使得开发者可以专注于PHP代码处理逻辑,而设计师则可以独立地进行HTML样式的编辑。本学习笔记将详细介绍Smarty的核心概念、安装...

    (第30讲) PHP模板引擎Smarty缓存应用

    Smarty是PHP领域中一款广泛应用的模板引擎,它将业务逻辑与视图呈现分离,使得开发者可以更专注于HTML的布局和设计,而不用关心PHP代码的嵌入。本讲主要介绍了Smarty在缓存应用方面的知识,包括配置、使用、清除以及...

    PHP模板引擎Smarty的安装配置及应用实现.pdf

    PHP模板引擎Smarty的安装配置及应用实现

    PHP100视频教程 27:PHP模板引擎Smarty入门使用.rar

    软件介绍 1、Smarty介绍及应用的优缺点  Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的...

    PHP模板引擎 Smarty 完全中文手册.rar

    Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,...

    php模板引擎 Smarty 手册

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ...┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ 如有转载请勿删除本说明文件,谢谢合作 ┃ ...

    PHP模板引擎smarty入门 中文WORD版

    本文档主要讲述的是PHP模板引擎smarty入门;希望本文档会给有需要的朋友带来帮助;Smarty是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码...

    用模板引擎Smarty来开发PHP程序.pdf

    Smarty与其他模板引擎如PHPLIB Template和Fast Template相比,具有更高的灵活性和效率。它提供了一系列的模板控制结构,如循环、条件语句、函数调用等,使得模板更接近自然语言,同时保持了与PHP的良好兼容性。此外...

    (第28讲) PHP模板引擎Smarty的变量操作符

    Smarty是一款广泛应用于PHP开发中的模板引擎,它将业务逻辑与视图层分离,使得开发者能够更专注于页面设计和用户体验。本讲将详细讲解Smarty中的变量操作符,帮助你更好地理解和运用这些工具。 首先,让我们来了解...

    php之Smarty模板引擎

    php Smarty

    PHP Smarty 模板引擎手册 CHM.rar

    Smarty是PHP世界中一款著名的模板引擎,它将呈现逻辑与业务逻辑分离,使得开发者可以更加专注于后端逻辑,而设计师可以自由地使用HTML和CSS来构建页面。本手册"PHP Smarty 模板引擎手册 CHM.rar"包含了关于Smarty的...

    PHP100视频教程 27:PHP模板引擎Smarty入门使用

    1、Smarty介绍及应用的优缺点 Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,...

    PHP100视频教程30:PHP模板引擎Smarty缓存应用.rar

    标题中的“PHP100视频教程30:PHP模板引擎Smarty缓存应用”是指一系列针对初学者和进阶者的PHP编程教程,其中的第30讲重点讲解了PHP的 Smarty 模板引擎以及其在缓存应用上的实现。Smarty 是一个广泛使用的PHP模板...

Global site tag (gtag.js) - Google Analytics