模板引擎,为了使用户界面与业务数据内容分离而产生的。web网站中,例如Smarty的模板引擎就是将html模板编译成php脚本,其主要功能就是将php和html分离。
传统的代码场景,php连接数据库取出数据,处理数据后,php代码与html代码混合输出,这种方式,如果后期修改代码的时候需要php程序员既要精通前端代码也要会熟练后台代码,不太方便。
希望将php与html代码分离开来,后台程序员专门做业务数据处理,前端人员精于html用户界面体验,所以模板引擎应运而生。将原本的<?php echo ?>替换为{}等特定的标签。实现界面与数据的分离,大大提升了开发效率,而且我们还可以实现数据分离(动态数据与静态数据),或者静态页面缓存等。
自己动手写一个简单的模板类
先说一下简单的模板引擎流程。
[1]把需要显示在页面的变量等赋值传到对象的属性中。
利用assign($array)方法 将数据传到模板类的$_data属性里面
[2]编译html模板 ,解析成响应php echo的代码
利用compile($template)方法替换模板内容,将{$data} 替换成<?php echo $this->_data; ?>,最后将编译过的内容生成php脚本文件。
同时在进行编译的时候要先判断是否已经存在编译后的文件,或者是修改模板后是否需要重新编译(判断文件时间先后)
[3]引入编译后的php文件
包含编译后的文件
//写一个简单的模板编译类
class Mini{
public $dir_template = '';//原 模板文件所在的文件夹
public $dir_compile = '';//后 模板编译后存放的位置
public $_data = array();//定义一个数组用来接收外部变量
/**
* 赋值给模板文件变量
*/
public function assign($key,$value){
$this->_data[$key] = $value;
}
/**
* 把指定的模板内容读取过来,然后编译成对应的php文件
*
*/
public function compile($template){
//读取模板内容
$source = file_get_contents($this->dir_template.'/' . $template);
//编译保存的文件
$outfile = $this->dir_compile . '/' . $template . '.php';
//判断是否已经有模板编译后的文件
if(file_exists($outfile) && (fileatime($this->dir_template.'/' .$template) > fileatime($outfile)) ){
return $outfile;
}
//替换模板里面的{$} 改成<?php echo ;
$source = str_replace('{$','<?php echo $this->_data[\'',$source);
$source = str_replace('}','\'];?>',$source);
//把编译后的文件保存 .php文件
file_put_contents($outfile,$source);
return $outfile;
}
/**
* 调用compile来编译模板并引用
*/
public function display($template){
$compile = $this->compile($template);
include($compile);//自动引入
}
}
file_get_contents($file) | 把文件读入一个字符串 |
file_put_contents($file,$str) | 将一个字符串写入文件 |
检查文件或目录是否存在 | |
fileatime($file) | 取得文件的上次访问时间 |
缺点
【1】编译模板需要花费时间 一般类似preg_match或者preg_replace正则函数匹配或者函数的标签截断匹配类似方法
【2】程序和模板分离后,需要把变量赋值到对象的属性上,增大开销。
优点
【1】模板的缓存技术,很棒,将原本的每次都需要走php脚本文件读取数据库,如果生成缓存,则仅需读取html
【2】业务与界面的分离看起来,代码逻辑更加清晰,等。