PHP使用模板的简单例子
test.php
$user = 'ZhangRongQuan';
$method = 'What are you doing?';
//导入类文件
require_once
这里包含3个文件:test.php执行文件、parser.php编译类、temp.tpl模板 test.php $user = '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 ' 我进行了编译 '; //编译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, "", $conts); //******************************************************** // \$this->arr['$1']里的['$1']可以写成['\\1']表示正则里的第一个分组, // 就是正则的()里的内容(这是正则的知识),前面使用数组在这 //里就可以保证变量值是对应我们所要的,比如,模板里的变量是 //{$user},那这所替代的是$this->arr['user']php模板,而数组arr的user元素恰 //好对应的值是$user,这个在assign方法里已经赋值过了 //******************************************************** } //创建PHP编译文件 file_put_contents($this->pn, $conts); } } temp.tpl {$user} {$method} (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |