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中文件上传的一个问题
Sep 04 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
关于PHP语言构造器介绍
Jul 08 PHP
php上传文件,创建递归目录的实例代码
Oct 18 PHP
PHP动态输出JavaScript代码实例
Feb 12 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
php微信公众号开发之现金红包
Apr 16 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
php cookie 登录验证示例代码
2009/03/16 PHP
PHP中echo和print的区别
2014/08/28 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
srcElement表格样式
2006/09/03 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
浅谈Angular 观察者模式理解
2018/11/01 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
详解python 发送邮件实例代码
2016/12/22 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python requests post多层字典的方法
2018/12/27 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
对Python _取log的几种方式小结
2019/07/25 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
PHP中如何创建和修改数组
2012/05/02 面试题
医护人员英文求职信范文
2013/11/26 职场文书
培训班通知
2015/04/25 职场文书
学校工会工作总结2015
2015/05/19 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
员工旷工检讨书
2015/08/15 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书