仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1157|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网页编程之模板引擎SMARTY

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
培训的第三阶段,开始接触MYSQL,设计数据库,学习PHP如何去连接MYSQL数据库。对于MYSQL,我并不陌生,因为学校开设了Linux系统的课程,对于数据库的操作。模板   用PHP完成MVC开辟形式的逻辑层和暗示层有多种模板引擎可供选择,然而官方引擎SMARTY出生后,选择就有了变更。它的理念和完成都是相当"前卫"的。本文次要会商SMARTY之于其他模板引擎的分歧特色,扼要引见了该引擎的装置及利用,并用一个小的测试案例对照了SMARTY和PHPLIB template的速度和易用性。
1、MVC需求模板
MVC最早是在SmallTalk言语的开辟过程当中总结出的一种设计形式,MVC分离代表了"模子"、"视图"和"掌握",目标就是让分歧的开辟脚色在大中型项目中各司其职。在收集使用法式的开辟中,可以用下图来暗示各概念之间的关系。



该图展现了一个复杂的WEB使用法式,用户在阅读器上看到信息是数据库办事器上的内容,但在这之前经由了使用办事器加工。开辟人员担任的就是创立数据布局、处置数据的逻辑和暗示数据的办法。

96年CGI在中国入手下手盛行的时分,初期的WEB法式员都是从HTML入手下手自学成材的,在PERL中print一行行的HTML并非一件难事,然而跟着收集的一步步提速,页面巨细也从现在的2、三十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>




这里暂且省略处置体例,在前面做专门对照会商。

2、为何选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有了一个很好的敌手。在测试之前,先谈一下在装置过程当中需求注重的成绩。

3、能够碰到的成绩
在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 = "/}";




这下装置就根基完成,没成绩了。

4、反衬和类比
先构想一下对测试的设计。次要的评选要素固然是速度了。为了停止速度测试,接纳了算术均匀数的作法。在测试页面中反复将页面熟成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发明该模板已被编译过了,因而最耗时的一步被跳过了,而敌手还要墨守成规地停止查找和交换任务。这是编译道理里讲到的很经典的"用空间换工夫"例子。

5、结论
结论就是假如你已爱上SMARTY了,那末还等甚么呢?固然并非说它就万能,就好像我用MVC形式来写我的团体网站,不但没有削减任务量,反而老是要为分歧条理间的耦合费心。

SMARTY不合适甚么呢?举个手册里的经典例子:天色预告网站。我还想到一个:股市大盘。在这类网站上用SMARTY会因为常常的重编译而效力偏低,仍是PHPLIB template更加合适。

本文并非为了对照两种引擎,而是为了申明SMARTY的优势。利用它最成心义的地方在于它是PHP新系统的一部分,作为一支自力的力气,除.NET和JAVA ONE这两大系统以外,大中型web开辟还有其余选择。这关于GNU项目来讲,其意义无异于刘邓大军千里跃进大别山。

参考文献

SMARTY官方站点:smarty.php.net
王晨:《在PHP世界当选择最适合的模板》
本文中测试法式下载:test.tar.bz2

  会有很多高手的鼓励,新手的支持,慢慢你劲头就十足,有更多的信心和兴趣去学。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-2-4 11:55:18 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
因胸联盟 该用户已被删除
板凳
发表于 2015-2-4 21:15:12 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
若天明 该用户已被删除
地板
发表于 2015-2-10 11:33:14 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
不帅 该用户已被删除
5#
发表于 2015-3-1 09:49:57 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
简单生活 该用户已被删除
6#
发表于 2015-3-13 21:39:48 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
透明 该用户已被删除
7#
 楼主| 发表于 2015-3-16 22:23:21 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
若相依 该用户已被删除
8#
发表于 2015-3-21 23:07:27 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
兰色精灵 该用户已被删除
9#
发表于 2015-3-22 21:56:53 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
山那边是海 该用户已被删除
10#
发表于 2015-3-29 03:41:36 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
变相怪杰 该用户已被删除
11#
发表于 2015-3-31 23:37:36 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
活着的死人 该用户已被删除
12#
发表于 2015-4-19 15:54:12 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
13#
发表于 2015-4-30 01:54:13 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
老尸 该用户已被删除
14#
发表于 2015-5-1 09:12:14 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
柔情似水 该用户已被删除
15#
发表于 2015-5-1 23:10:17 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
冷月葬花魂 该用户已被删除
16#
发表于 2015-5-3 00:38:04 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
小妖女 该用户已被删除
17#
发表于 2015-6-5 23:56:17 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
小女巫 该用户已被删除
18#
发表于 2015-6-13 20:23:49 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
爱飞 该用户已被删除
19#
发表于 2015-7-2 23:52:16 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表