$user = 39;ZhangRongQuan';
$method = 'What are you doing?';
//导入类文件
require_once './parser.php';
//创建工具
$cms = parser::inc();
//往数组添加元素
$cms->assign('user', $user);
//往数组添加元素
$cms->assign('method', $method);
//编译模板文件并载入php或者缓存文件
$cms->display('./temp.tpl'); parser.php
class parser{
private
//用数组来存放模板变量的内容,键值便是变量名
$arr = array(),
//静态的缓存文件
$fn,
//编译文件
$pn;
private
static $int;//用于单例
//初始化传入的参数是模板文件
protected function __construct(){
$fname = 'c_' . md5('parser');
//静态的缓存文件
$this->fn = './' . $fname . '.htm';
//编译文件
$this->pn = './' . $fname . '.php';
} //单例
public static function inc(){
if(!self::$int instanceof self)
self::$int = new self();
return self::$int;
}
//给数组赋值,键值便是变量名
public function assign($key, $val){
if(!!$key)
//给模板变量赋值,key是变量名
$this->arr[$key] = $val;
//
//用数组来吸收变量值,可以在后面的编译更换时,
//让模板的变量与值相对应,如果直策应用变量
//来吸收,会造成模板里所有的变量的值都一样
//
}
//加载文件,并根据条件创建缓存文件
public function display($cname){
//获取当前调用本类的文件的文件名
$currentFile = './' . basename($_SERVER['PHP_SELF']);
//
//如果存在缓存文件,并且缓存文件修正的韶光比编译
//文件晚,并且编译文件修正的韶光比当前文件晚,则
//直接载入缓存文件
//
$fn = $this->fn;
$pn = $this->pn;
if(file_exists($fn) && $this->copTime($fn, $pn) && $this->copTime($pn, $currentFile)){
//测试用,看条件是否成立,条件成立即干系内容没有发生变革
echo rand();
//内容不变时直接载入缓存文件,无需重写缓存文件
include_once $fn;
}else{
echo '<p>我进行了编译</p>';
//编译PHP文件
$this->par($cname);
//载入编译文件
include_once $pn;
//内容发生了变革,要重写缓存文件
file_put_contents($this->fn, ob_get_contents());
}
}
//判断文件的修正韶光
private function copTime($an, $dn){
return filemtime($an) >= filemtime($dn);
}
//编译PHP文件
private function par($cname){
//导入模板文件,获取文件的内容
$conts = file_get_contents($cname);
//正则表达式
$reg = '/\{\$([\w]+)\}/';
//更换
if(preg_match($reg, $conts)){
$conts = preg_replace($reg, "<?php echo \$this->arr['$1'] ?>", $conts);
//
// \$this->arr['$1']里的['$1']可以写成['\\1']表示正则里的第一个分组,
// 便是正则的()里的内容(这是正则的知识),前面利用数组在这
//里就可以担保变量值是对应我们所要的,比如,模板里的变量是
//{$user},那这所替代的是$this->arr['user'],而数组arr的user元素恰
//好对应的值是$user,这个在assign方法里已经赋值过了
//
}
//创建PHP编译文件
file_put_contents($this->pn, $conts);
}
} temp.tpl
<h1>{$user}</h1>
<h2>{$method}</h2>