用了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

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test_tpl_demo</title>
</head>
<body>
{$name}:{$age}:{$message}
</body>
</html>

运行文件 test_tpl.php

<?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

php模板引擎技术简单实现的更多相关文章

  1. Smarty模板引擎技术

    Smarty模板引擎技术 什么是模板引擎? 什么是Smarty模板引擎? 为何选择Smarty模板引擎? 如何使用Smarty模板引擎? 一.历史背景 场景一:回顾之前编写PHP项目的方式 //链接数 ...

  2. 2019-07-24 Smarty模板引擎的简单应用

    smarty是什么? Smarty是一个使用PHP写出来的模板引擎,是业界最著名的PHP模板引擎之一.Smarty分离了逻辑代码和外在的内容,提供一种易于管理和使用的方法,用来将原本与HTML代码混杂 ...

  3. Smarty模板引擎技术二

    Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量   注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...

  4. 【原创】javascript模板引擎的简单实现

    本来想把之前对artTemplate源码解析的注释放上来分享下,不过隔了一年,找不到了,只好把当时分析模板引擎原理后,自己尝试 写下的模板引擎与大家分享下,留个纪念,记得当时还对比了好几个模板引擎来着 ...

  5. SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆

    在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...

  6. 前端数据渲染及mustache模板引擎的简单实现

    早期数据渲染的几种方式 在模板引擎没有诞生之前,为了用JS把数据渲染到页面上,诞生了一系列数据渲染的方式. 最最基础的,莫过于直接使用DOM接口创建所有节点. <div id="roo ...

  7. Thymeleaf 模板引擎技术

    引入Thymeleaf: <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf. ...

  8. 模板引擎的简单原理template

    ​ var templateStr = "我的名字叫<%=name%>我是一只小狗,今年<%=age%>岁."; var data = { name:'旺财 ...

  9. php模板引擎

    http://baike.baidu.com/link?url=HmXfdJBv3zpCdnZPeaSmZmqDBHlyTBnz9Rmb5it-jf1_NLHfaku6_i8ssUYbnaTQEBD4 ...

随机推荐

  1. Math对象

    <script type="text/javascript"> /* Math对象常用的方法: ceil 向上取整 floor() 向下取整 random() 随机数方 ...

  2. Swift—Cocoa错误处理模式-备

    Swift错误处理模式,在Swift1.x和Swift 2.0是不同的两种模式. Swift 1.x代码错误处理模式采用Cocoa框架错误处理模式,到现在Objective-C还沿用这种处理模式,而S ...

  3. 关于GestureDetector.OnGestureListener的onScroll参数distance问题

    关于GestureDetector.OnGestureListener类的onScroll方法参数distanceX和distanceY问题 看到有文章上说onScroll方法中distanceX和d ...

  4. Head First --- Python 第一章

    List 1. python -V 查看python当前版本 2. list.pop() 删除列表里的最后一个元素,并返回删除元素的值 3. list.extend(['a','b','c']) 在原 ...

  5. oschina大数据开源软件

    Hadoop 图形化用户界面 Hue 大数据可视化工具 Nanocubes 企业大数据平台 RedHadoop 大数据查询引擎 PrestoDB Hadoop集群监控工具 HTools 安全大数据分析 ...

  6. 金错刀对话口袋购物王珂:找到痛点,确认卖点,制造爆点! - 资讯 - i黑马网

    金错刀对话口袋购物王珂:找到痛点,确认卖点,制造爆点! - 资讯 - i黑马网 金错刀对话口袋购物王珂:找到痛点,确认卖点,制造爆点!

  7. [置顶] 如何运行用记事本写的java程序

               今天用记事本写了一个java程序,测试能运行,现在把它分解成几个步骤,利于大家理解:           1. 新建一个记事本,后缀名是  .java  :然后在里面写一段jav ...

  8. java笔记3之赋值运算符

    赋值运算符:        基本的赋值运算符:=            把=右边的数据赋值给左边.          扩展的赋值运算符:+=,-=,*=,/=,%=            += 把左边 ...

  9. superslide2

    标签切换 / 书签切换 / 默认效果 http://www.superslide2.com/demo.html 4个Web前端经典实用值得学习收藏的地图实现模板~ http://www.iteye.c ...

  10. SurfaceView类透明背景设置

    将SurfaceView背景设置为透明,主要添加以下几句话就可以了: 在SurfaceView创建后设置一下下面的参数: setZOrderOnTop(true); getHolder().setFo ...