混编文件一旦生成好,就不用再次生成,直接引入即可。
(1)给每一个应用都生成一个混编文件,执行之前先判断是否存在,如果存在就直接引入
(2)如果对应的模板文件有修改,对应的混编文件还需要重新生成。通过文件的修改时间戳来确定,如果混编文件的时间戳大于模板文件的时间戳,说明模板文件未发生修改;如果混编文件的时间戳小于模板文件的时间戳,说明模板文件发生了修改。
模板引擎优化代码:
<?php
//模板引擎类
class MiniSmarty{
public $template_dir = "./view/";//模板文件夹
public $templatec_dir = "./viewc/";//混编文件夹
//给该类声明属性,用于存储外部的变量信息
public $tpl_var = array();
//把外部变量设置为类内部属性的一部分
function assign($k, $v){
$this->tpl_var[$k] = $v;
}
//把compile()方法封装一下,更便于理解
function display($tpl){
$n = $this->compile($tpl);
require $n;
}
//“编译”模板文件({ }标记替换为php标记)
function compile($tpl){
$com_file = $this->templatec_dir . $tpl . ".php";//混编文件地址
$tpl_file = $this->template_dir . $tpl;//模板文件地址
//走“已经生成”的混编文件
//(1)该混编文件已经存在
//(2)混编文件的修改时间 大于 模板文件的修改时间(模板文件有修改)
if( file_exists($com_file) && filemtime($com_file) > filemtime($tpl_file) ){
//require $com_file;
return $com_file;
}else{//混编文件不存在或者模板文件有修改
echo "new file";
//获得模板文件内部具体的模板内容
$cont = file_get_contents($tpl_file);
//echo $cont;
//替换:{ 替换为 < ?php echo $this->tpl_var['
$cont = str_replace("{\$", "<?php echo \$this->tpl_var['", $cont);
//替换:} 替换为 '];? >
$cont = str_replace("}", "'];?>", $cont);
//echo $cont;
//把生成好的编译内容(php+html混编内容)放入一个文件里
file_put_contents($com_file, $cont);
//引入混编文件 require $com_file;
return $com_file;
}
}
}