php模板引擎技术简单实现


Posted in PHP onMarch 15, 2016

用了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) > 0){
        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) > 0){
        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'=>'100'
    );
  $tpl->assign($tplarr);
  $tpl->assign('message','this is a demo');
  $tpl->display('testTpl.html');

?>

输出:waited:100:this is a demo

生成编译文件:972fa4d270e295005c36c1dbc7e6a56c.php

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
PHP中使用BigMap实例
Mar 30 PHP
php使用socket post数据到其它web服务器的方法
Jun 02 PHP
汇总PHPmailer群发Gmail的常见问题
Feb 24 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
Yii2实现ajax上传图片插件用法
Apr 28 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 PHP
9个比较实用的php代码片段
Mar 15 #PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 #PHP
php图片添加文字水印实现代码
Mar 15 #PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 #PHP
Yii rules常用规则示例
Mar 15 #PHP
基于laravel制作APP接口(API)
Mar 15 #PHP
使用Composer安装Yii框架的方法
Mar 15 #PHP
You might like
PHP5 安装方法
2006/10/09 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
python常用函数详解
2016/09/13 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
python import 上级目录的导入
2020/11/03 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
Python何绘制带有背景色块的折线图
2022/04/23 Python
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技