php开发中常用的模板有smarty, zend framework自身也有一套模板。实际上除非不得不使用它们,否则你应该很快就意识到,使用起来并不怎么方便。smarty需要引入库文件,学习smarty模板语法,虽然和php相似,却又不尽相同,增加了学习成本,使用起来还要config一下。要想使用ZendFramework 中的模板,肯定得使用ZF库不可,已使用ZF库,开发模式便很容易被限制在ZF下,所以也不是很灵活。
先说一说为什么要使用模板技术,实际开发中所谓模板,不过是一段特殊的静态代码与动态变量的结合。所以调用模板函数时最常用的两个方法是:
(1) $tplObject->assign($key,$value) — 模板变量赋值。(2)$tplObject->fetch($template_file) — 将模板对象与某一个模板文件结合输出结果。
有人说,php中的模板技术是为了“要让美工和程序员的工作分开,要让代码层和表现层分开。”,愿望是好的,但实际上我们使用的任意一款模板库的模板文件,美工都无法直接使用,很难做到所谓的”程序员和美工分开“。 而”代码和表现分开“更像是纯原生的字符串模板一样,例如”{$name} is a good guy! <br/><h2>{$name}</h2> is so beautiful!“ 中只需要替换name变量,就可以达到所谓的”代码表现分离“。实际上这用纯原生模板,功能有限。
这也就意味着,模板文件中的变量并不只是字符串替换这么简单,还应该允许其他多种运算。那么模板类库是怎么解决这个问题的呢?smarty里采用了类php语法的模板语法,例如{foreach}{/foreach},{if}{else}{/if}…{php} {php}等等,ZendFramework里的view倒是没有采用增添语法的方式,采用原生php的方式。此时我们才想到,php代码本身就是模板的最合适实现,不需要再搞出其他模板来。于是我们可以有一个简单的模板实现,先举一个简单的例子:
/**** * 简易的模板类 * 两个常用方法 * assign($key,$value)---添加模板变量,$key是模板文件中的变量名称。 * fetch($inc_file_path)--与模板文件一块儿解析返回解析后的字符串。 */ class IncFile { private $__vars = array ();//模板变量hash数组 public function __construct() { } /*** * 增加模板变量 * @param String $key * @param Object|Value $value。 */ public function assign($key, $value) { $this->__vars[$key] = $value; } public function fetch($inc_path) { $result = ""; ob_start();//打开缓冲区,准备输出模板结果 foreach ($this->__vars as $k => & $v) { $$k = $v;//这里把hash数组中的元素,以局部变量的方式定义声明一下,这样才能用到模板文件里。 //例如模板中<?php echo $user.name?>,hash数组中是$__vars['user']={name=>'Tom'} } include ($inc_path);//将模板文件包含进来,执行 $result = ob_get_contents();//返回缓冲区内容 ob_get_clean();//清空缓冲区 return $result; } } 这便是我最近经常使用的一个模板函数,使用起来很是轻巧。
我个人还是比较喜欢原生态的方式,毕竟,还少了一次IO的操作嘛~
O(∩_∩)O~,模板的初衷是为了重复利用,利于修改。在不需要模板的时候用它,确实会增加不必要的IO。
模板还是有很大价值的。