手写smarty迷你模板类
php代码与html代码写在一起,很不方便修改,因此要把php与html彻底分离,也就是controller(业务)与view(表现)的分离。
如果使用原生php输出,不用解析标签程序执行更快,那为什么还要用smarty模板呢?模板使用比较广泛,学习了解模版思想,达到自己写模板,比如ecshop用的改进后的smarty模板
smarty的2个大版本,3,和2.6,区别: 2.6是PHP4时代的写作风格,smarty3,是纯面向对象的写作风格.
迷你模板类:接收模板文件,编译成执行的PHP文件,返回编译后的PHP文件,如果不修改模板,可以一次编译可重复使用;
模板类的第1步:把标签解析PHP输出语句,模板文件-->PHP文件,为了目录清晰,我们把模板和编译后的结果,放在不同的目录里.用2个属性来记录这2个目录
class mini {
public $template_dir = ''; // 模板文件所在的位置
public $compile_dir = ''; // 模板编译后存放的位置
// 定义一个数组,用来接收外部的变量
public $_tpl_var = array();
public function assign($key,$value) { //接收外部变量titel
$this->_tpl_var[$key] = $value; //放入数组中
}
public function display($template) {
$comp = $this->compile($template);
include($comp);
}
public function compile($template) {
// 读出模板内容
$temp = $this->template_dir . '/' . $template;
$source = file_get_contents($temp); //读出模板内容
// echo $source;
$comp = $this->compile_dir . '/' . $template . '.php';
// 判断模板是否已经存在,
if(file_exists($comp) && filemtime($temp) < filemtime($comp)) { //先判断编译文件是否存在,并且模板文件修改时间要小于编译后文件修改时间,来判断模
板是否有修改
return $comp;
}
// 替换模板内容
$source = str_replace('{$','',$source);
// echo $source;
// 再把编译后的内容保存成 .php文件
file_put_contents($comp,$source);
return $comp; //返回编译后的文件
}
}
在控制页面04.php中
include('./mini.php'); //引用mini类文件
$mini = new mini(); //实例化mini
$mini->template_dir = './templates'; //定义模板文件目录
$mini->compile_dir = './compile'; //定义编译后php文件目录
//数据库读取数据
$title = '两会召开';
$content = '好会议,好房子,好奶粉';
放入_tpl_var数组中,让变量在编译后的php文件中输出
$mini->assign('title',$title);
$mini->assign('content',$content);
$mini->display('04temp.html'); //调用display返回编译后的文件
总结:$smarty的工作流程,1:把需要显示的全局变量,赋值,塞到对象内部的属性上,放到一个数组里,2:编译模板,把{$标签},解析成相应的php echo 代码,3:引入编译后的PHP文件
使用smarty的步骤:1:smarty是一个类,要使用,需先引入并实例化,2:assign赋值
3:display [编译到输出]
smarty之辩:1:编译模板,浪费时间,2:要把变量再重新赋值到对象的属性上,增大的开销.
我默默地来,默默的走开,不带走一片云彩!
能加个Q,做个好友吗?或者换个友链
这都是学问,可我就是看不明白~
代码小白 来支持一下
我一直怀疑现在模板存在的必要性