事情的起因:你用过FastTemplate吗?
对于PHP工程中的模板应用,其实我和我的同事们已经在许多的项目中接触过--关于它的好处,我想无论是在实际开发阶段还是上升到设计模式的角度都已经有很多"前辈先哲"讨论过了。就项目实施而言,在一些中型甚至大型的项目中,有效的将HTML(还有其他文本形式的表现层)和PHP代码分开,不仅在开发阶段可以分别提高界面设计人员和应用程序编写人员的工作效率,更会给项目的测试和维护带来巨大的便利。
但是--本文的目的不是讨论模板的优缺点,也不是作为指导性的教程讲授如何在PHP项目中使用模板,而是以应用的视角比较两种PHP世界中最为流行的模板处理方式(其实只不过是两种模板类):PHPLIB Template和FastTemplate。
其实我一直都在"安静"的使用着PHPLIB Template--很稳定而且看上去速度也不错,以至于我并不想再去不安的寻找可能更好的替代品--虽然我也知道这个地球上还有FastTemplate这样的东西(而且还在Perl的世界中大名鼎鼎)。直到有一天,有一个同事问我:"不知道FastTemplate怎么样?为什么我们不试试FastTemplate呢?"
"好吧,就让我们试试!"不过作为一个稳妥的方法,在任何新的模式或者方法引入项目之前,最好能够更加全面的了解它,以及找到一个或者几个足够说服自己和同事去采用它的理由--对于FastTemplate也不例外。
主角出场:了解PHPLIB Template以及FastTemplate
前面已经说过,我已经使用PHPLIB有一段时间了--我想屏幕前的你也许和我一样,也对这个优秀的工具类库印象很深吧!同样,当我开始寻求模板的解决办法时,很自然的就会在最接近身边的工具箱里搜寻,于是我找到了PHPLIB中的Template类。在最初的很快浏览完它提供的API之后(当然还得感谢PHPLIB详尽的文档),我就开始了使用它的历程--直到现在。
而FastTemplate似乎名气更响亮一些,在其发迹的Perl世界中自然是这样,在PHP世界中似乎也是,单单从这一点上就足够让人相信它的能力了。
关于两者的使用办法,本来我想在这里多废话几句的;但是毕竟觉得自己恐怕专门写出两篇教程来也没有现有的教程受欢迎--在本文的参考资料中有关于PHPLIB Template和FastTemplate的有名教程,如果你自认还没有对这两种模板或者其中的一种有所认识,建议你先去看看那两篇文章,应该会得到不少有益的模板应用知识。
(一番鼠标点击以及眼球转动甚至亲自编写测试代码之后,)现在你对两种模板都有了一些了解,也许已经发现了它们之间的很多相似之处,在下面我就会将这些地方归纳一下。
变量的设置很明显,{FOO}或者{BAR}的形式在两种模板中都是指定的形式;也就是说,两种模板处理方式中,模板文件本身的外貌应该可以是一致的(比如都是HTML文件中间含有将要被替换的以{}标识的变量)。 模板类的初始化(类的构建器)
都需要在构建模板类的时候指定模板文件存在的目录位置。 变量的替换
模板处理中最常用的就是变量替换,两种方式除了方法名不同之外(PHPLIB Template采用set_var(),而FastTemplate采用assign()),用法几乎也是一致的--可以采用(key, value)的方式,也可以直接传递一个数组(array(key=>value))。 模板文件的处理
都是采用为每一个模板文件指定一个句柄(handler)的办法,同时句柄也可以作为变量的值替换另一模板文件中的变量。 解析、输出过程
都是需要调用parse()方法(这个方法名竟然是相同的)将需要输出的模板文件解析后赋值给一个句柄,然后调用各自输出的方法(PHPLIB Template中是p(),FastTemplate中是FastPrint())输出该句柄的内容并结束处理。 重复解析的过程
比如从数据库中取出几条记录需要显示而模板文件只有可替换的一行变量的时候,就很需要这样的功能。两者都具有这样的功能,只是使用时稍稍有些不同而已(PHPLIB Template采用parse(handler, value, true),而FastTemplate采用parse(handler, .value)在值的前面多加一个点),应该说PHPLIB Template的方法构造得相对优美一点。 区块解析的过程(或者可以称作动态解析)
想像一下你需要从数据库中取出符合条件的数据并显示在网页中--但是因为条件会不尽相同,你并不能明确的知道会有多少条数据--这时候如果你又要采用模板,那么区块就是最好的选择。它是在模板中用特定的符号定义的部分,这一部分可以反复的被解析并添加到(而不是前一次的解析被后一次覆盖)输出网页中。区块也许就像下面显示的一样(左边是PHPLIB Template采用的区块设置,而右边则是FastTemplate采用的):