用了smarty,tp过后,也想了解了解其模板技术是怎么实现,于是写一个简单的模板类,大致就是读取模板文件->替换模板文件的内容->保存或者静态化
tpl.class.php主要解析
assign 方法实现
/**
* 模板赋值操作
* @param mixed $tpl_var 如果是字符串,就作为数组索引,如果是数组,就循环赋值
* @param mixed $tpl_value 当$tpl_var为string时的值,默认为 null
*/
public function assign($tpl_var,$tpl_value=null){
if(is_array($tpl_var) && count($tpl_var) > ){
foreach ($tpl_var as $k => $v) {
$this->tpl_vars[$k] = $v;
}
}elseif($tpl_var){
$this->tpl_vars[$tpl_var] = $tpl_value;
}
}
fetch 方法实现
/**
* 生成编译文件
* @param string $tplFile 模板路径
* @param string $comFile 编译路径
* @return string
*/
private function fetch($tplFile,$comFile){
//判断编译文件是否需要重新生成(编译文件是否存在或者模板文件修改时间大于编译文件的修改时间)
if(!file_exists($comFile) || filemtime($tplFile) > filemtime($comFile)){
//编译,此处也可以使用ob_start()进行静态化
$content = $this->tplReplace(file_get_contents($tplFile));
file_put_contents($comFile, $content);
}
}
简单编译方法:按照规则进行正则替换
/**
* 编译文件
* @param string $content 待编译的内容
* @return string
*/
private function tplReplace($content){
//转义左右定界符 正则表达式字符
$left = preg_quote($this->left_delimiter,'/');
$right = preg_quote($this->right_delimiter,'/');
//简单模拟编译 变量
$pattern = array(
//例如{$test}
'/'.$left.'\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)'.$right.'/i'
);
$replace = array(
'<?php echo $this->tpl_vars[\'${1}\']; ?>'
);
//正则处理
return preg_replace($pattern, $replace, $content);
}
display = fetch+echo
/**
* 输出内容
* @param string $fileName 模板文件名
*/
public function display($fileName){
//模板路径
$tplFile = $this->template_dir.'/'.$fileName;
//判断模板是否存在
if(!file_exists($tplFile)){
$this->errorMessage = '模板文件不存在';
return false;
}
//编译后的文件
$comFile = $this->compile_dir.'/'.md5($fileName).'.php';
$this->fetch($tplFile,$comFile);
include $comFile;
}
其他属性
//模板文件存放位置
private $template_dir = 'templates';
//编译文件存放位置
private $compile_dir = 'compiles';
//左定界符
private $left_delimiter = '{';
//右定界符
private $right_delimiter = '}';
//内部临时变量,存储用户赋值
private $tpl_vars = array();
//错误信息
private $errorMessage = '';
/**
* 修改类属性的值
* @param array $configs 需要修改的相关属性及值
* @return bool
*/
public function setConfigs(array $configs){
if(count($configs) > ){
foreach ($configs as $k => $v) {
if(isset($this->$k))
$this->$k = $v;
}
return true;
}
return false;
}
测试
模板文件 testTpl.html
test_tpl_demo{$name}:{$age}:{$message}
运行文件 test_tpl.php
require 'Tpl.class.php';
$tpl = new Tpl();
$tplarr = array(
'name'=>'waited',
'age'=>''
);
$tpl->assign($tplarr);
$tpl->assign('message','this is a demo');
$tpl->display('testTpl.html');
?>
输出:waited:100:this is a demo
生成编译文件:972fa4d270e295005c36c1dbc7e6a56c.php
Smarty模板引擎技术
Smarty模板引擎技术 什么是模板引擎? 什么是Smarty模板引擎? 为何选择Smarty模板引擎? 如何使用Smarty模板引擎? 一.历史背景 场景一:回顾之前编写PHP项目的方式 //链接数 ...
2019-07-24 Smarty模板引擎的简单应用
smarty是什么? Smarty是一个使用PHP写出来的模板引擎,是业界最著名的PHP模板引擎之一.Smarty分离了逻辑代码和外在的内容,提供一种易于管理和使用的方法,用来将原本与HTML代码混杂 ...
Smarty模板引擎技术二
Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量 注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...
【原创】javascript模板引擎的简单实现
本来想把之前对artTemplate源码解析的注释放上来分享下,不过隔了一年,找不到了,只好把当时分析模板引擎原理后,自己尝试 写下的模板引擎与大家分享下,留个纪念,记得当时还对比了好几个模板引擎来着 ...
SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆
在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...
Thymeleaf 模板引擎技术
引入Thymeleaf: 我是一只小狗,今年岁."; var data = { name:'旺财 ...
php模板引擎
http://baike.baidu.com/link?url=HmXfdJBv3zpCdnZPeaSmZmqDBHlyTBnz9Rmb5it-jf1_NLHfaku6_i8ssUYbnaTQEBD4 ...
php Smarty模板引擎配置与测试
Smarty简介 smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页 ...
随机推荐
WebAPI接口返回ArrayList包含Dictionary对象正确解析
一.问题提出 为了减少流量,将key-value(键值对)直接输出到Dictionary,接口返回结果如下: 其中{}里面内容如下: 上图显示600是键,4 ...
惊涛怪浪(double dam-break) -- position based fluids
切入正题之前,先胡说八道几句. 据说爱因斯坦讲过:关于这个世界最难以理解的就是它是可以被理解的.人类在很长的时间里,都无法认知周围变幻莫测的世界,只能编造出无数的神祗来掌控世上万物的运行.到了近 ...
js去掉所有空格
Python2.x的编码问题
1. 计算机编码历史 ASCII Python的默认编码,其是一种单字节的编码.刚开始计算机世界里只有英文,而单字节可以表示256个不同的字符.最开始ASCII只定义了128个字符编码,包括96个文字 ...
4.app是怎么炼成的
很多刚进入app后端的小伙伴,有的是之前没有接触过这个行业,有的是只在学校学习了基本的技术知识,不知道开发app的整个流程是怎么样的,因此心里会有一股恐惧.听着别人口中的一大串app相关的术语,也不知 ...
L2-2 重排链表 (25 分)
给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→L2→⋯.例如:给定L为1→2→3→4→5→6,则输出 ...
MFC之菜单
1菜单与菜单项的操作 //获取菜单指针----CWnd::GetMenu() //GetSubMenu()获取子菜单 /CheckMenuItem()加入/取消标记 GetMenu()->Get ...
ArcGIS Engine Maplex Label(标注)使用一例(转)
/// /// MaplexEngine标注 /// ///