php模板实现

         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;
	}
}
这便是我最近经常使用的一个模板函数,使用起来很是轻巧。

2 comments to php模板实现

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Protected by WP Anti Spam