• 技术文章 >后端开发 >php教程

    php模板引擎技术简单实现_php实例

    2016-06-07 17:08:52原创381

    用了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,'//m.sbmmt.com/m/');
          $right = preg_quote($this->right_delimiter,'//m.sbmmt.com/m/');
    
          //简单模拟编译 变量
          $pattern = array(
              //例如{$test}
              '//m.sbmmt.com/m/'.$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.'//m.sbmmt.com/m/'.$fileName;
    
          //判断模板是否存在
          if(!file_exists($tplFile)){
            $this->errorMessage = '模板文件不存在';
            return false;
          }
    
          //编译后的文件
          $comFile = $this->compile_dir.'//m.sbmmt.com/m/'.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

    
    
    
      
      test_tpl_demo
    
    
    {$name}:{$age}:{$message} 运行文件 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

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 模板引擎
    上一篇:YII Framework框架教程之缓存用法详解_php实例 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文详解PHP用流方式实现下载文件(附代码示例)• PHP反序列化入门总结(小白必看)• PHP原生类的总结分享• 聊聊PHP escapeshellarg函数使用的中文问题• 分享PHP函数使用小工具(附代码示例)
    1/1

    PHP中文网