• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP模版引擎原理、定义与用法实例

    本文实例讲述了PHP模版引擎原理、定义与用法。分享给大家供大家参考,具体如下:

    template存放模版源文件

    模版编译工具类

    Compline.class.php

    ?php
    /**
    * 模板编译工具类
    */
    class Compile
    {
      private $template;     //带编译文件
      private $content;      //需要替换的文本
      private $comfile;      //编译后的文件
      private $left = '{';     //左界定符
      private $right = '}';    //右界定符
      private $value = array();   //值栈
      private $php_turn;
      private $T_P = array();
      private $T_R = array();
      public function __construct($template, $compileFile, $config)
      {
       $this->template = $template;
       $this->comfile = $compileFile;
       $this->content = file_get_contents($template);
       if($config['php_turn'] === false)
       {
         $this->T_P[] = "/\&;(=|php|)(.+?)\&;>/is";
         $this->T_R[] = "lt;? \\1\\2? gt";
       }
       //{$var}
       $this->T_P[] = "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/";
       //{foreach $b}或者{loop $b}
       $this->T_P[] = "/\{(loop|foreach) \\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/i";
       //{[K|V]}
       $this->T_P[] = "/\{([K|V])\}/";
       //{/foreach}或者{\loop}或者{\if}
       $this->T_P[] = "/\{\/(loop|foreach|if)}/i";
       //{if (condition)}
       $this->T_P[] = "/\{if (.* ?)\}/i";
       //{(else if | elseif)}
       $this->T_P[] = "/\{(else if|elseif) (.* ?)\}/i";
       //{else}
       $this->T_P[] = "/\{else\}/i";
       //{#...# 或者 *...#,注释}
       $this->T_P[] = "/\{(\#|\*)(.* ?)(\#|\*)\}/";
       $this->T_R[] = "?php echo \$this->value['\\1']; ?>";
       $this->T_R[] = "?php foreach ((array)\$this->value['\\2'] as \$K => \$V) { ?>";
       $this->T_R[] = "?php echo \$\\1; ?>";
       $this->T_R[] = "?php } ?>";
       $this->T_R[] = "?php if (\\1) { ?>";
       $this->T_R[] = "?php }else if (\\2) { ?>";
       $this->T_R[] = "?php }else{ ?>";
       $this->T_R[] = "";
      }
      public function compile()
      {
       $this->c_all();
       $this->c_staticFile();
       file_put_contents($this->comfile, $this->content);
      }
      public function c_all()
      {
       $this->content = preg_replace($this->T_P, $this->T_R, $this->content);
      }
      /**
      * 加入对JavaScript文件的解析
      * @return [type] [description]
      */
      public function c_staticFile()
      {
       $this->content = preg_replace('/\{\!(.* ?)\!\}/', 'script src=\\1'.'?t='.time().'>/script>', $this->content);
      }
      public function __set($name, $value)
      {
       $this->$name = $value;
      }
      public function __get($name)
      {
       if(isset($this->$name))
       {
         return $this->$name;
       }
       else
       {
         return null;
       }
      }
    }
    
    

    Template.class.php

    ?php
    /**
    * Template
    */
    class Template
    {
      private $arrayConfig = array(
       'suffix'   => '.tpl',  //模板的后缀
       'templateDir' => 'template/', //模板所在的文件夹
       'compileDir'  => 'cache/',  //编译后存放的目录
       'cache_html'  => true,   //是否需要编译成静态的html文件
       'suffix_cache' => '.html',  //设置编译文件的后缀
       'cache_time'  => 7200,   //设置多长时间自动更新
       'php_turn'  => true,   //设置是否支持php原生代码
       'debug'     => false,
       );
      public $file;         //模板文件名,不带路径
      public $debug = array();     //调试信息
      private $value = array();    //值栈
      private $compileTool;      //编译器
      private $controlData = array();
      static private $instance = null;  //模板类对象
      public function __construct($arrayConfig = array())
      {
       $this->debug['begin'] = microtime(true);
       $this->arrayConfig = array_merge($this->arrayConfig, $arrayConfig);
       $this->getPath();
       if(!is_dir($this->arrayConfig['templateDir']))
       {
         exit("template dir isn't found!");
       }
       if(!is_dir($this->arrayConfig['compileDir']))
       {
         if(strtoupper(substr(PHP_OS,0,3)) === 'WIN')
         {
          mkdir($this->arrayConfig['compileDir']);
         }
         else
         {
          mkdir($this->arrayConfig['compileDir'], 0770, true);
         }
       }
       include('Compile.class.php');
      }
      public function getPath()
      {
       $this->arrayConfig['templateDir'] = strstr(realpath($this->arrayConfig['templateDir']), '\\', '/').'/';
       $this->arrayConfig['compileDir'] = strstr(realpath($this->arrayConfig['compileDir'])), '\\', '/').'/';
      }
      /**
      * 取得模板引擎的实例
      */
      public static function getInstance()
      {
       if(is_null(self::$instance))
       {
         self::$instance = new Template();
       }
       return self::$instance;
      }
      /**
      * 单独设置引擎参数
      * 也支持一次性设置多个参数
      */
      public function setConfig($key, $value = null)
      {
       if(is_array($key))
       {
         $this->arrayConfig = $key + $this->arrayConfig;
       }
       else
       {
         $this->arrayConfig[$key] = $value;
       }
      }
      /**
      * 获取当前模板引擎配置,仅供调试使用
      */
      public function getConfig($key = null)
      {
       if($key  array_key_exists($key, $this->arrayConfig))
       {
         return $this->arrayConfig[$key];
       }
       else
       {
         return $this->arrayConfig;
       }
      }
      /**
      * 注入单个变量
      */
      public function assign($key, $value)
      {
       $this->value[$key] = $value;
      }
      /**
      * 注入数组变量
      */
      public function assignArray($array)
      {
       if(is_array($array))
       {
         foreach ($array as $k => $v) {
          $this->value[$k] = $v;
         }
       }
      }
      /**
      * 获取模板的位置
      * @return [type] [description]
      */
      public function path()
      {
       return $this->arrayConfig['templateDir'].$this->file.$this->arrayConfig['suffix'];
      }
      /**
      * 判断配置文件是否要求缓存
      */
      public function needCache()
      {
       return $this->arrayConfig['cache_html'];
      }
      /**
      * 判断是否需要缓存
      */
      public function reCache($file)
      {
       $flag = false;
       $cacheFile = $this->arrayConfig['compileDir'].md5($file).$this->arrayConfig['suffix_cache'];
       if($this->arrayConfig['cache_html'] === true)
       {
         //需要缓存
         $timeFlag = (time() - @filemtime($cacheFile))  $this->arrayConfig['cache_time'] ? true : false;
         if(is_file($cacheFile)  filesize($cacheFile) > 1  $timeFlag)
         {
          //缓存存在且未过期
          $flag = true;
         }
         else
         {
          $flag = false;
         }
       }
       return $flag;
      }
      /**
      * 展示模板
      */
      public function show($file)
      {
       $this->file = $file;
       if(!is_file($this->path()))
       {
         exit('找不到对应的模板');
       }
       $compileFile = $this->arrayConfig['compileDir'].md5($file).'.php';
       $cacheFile = $this->arrayConfig['compileDir'].md5($file).$this->arrayConfig['suffix_cache'];
       if($this->reCache($file) === false)
       {
         //如果需要缓存
         $this->debug['cached'] = 'false';
         $this->compileTool = new Compile($this->path(), $compileFile, $this->arrayConfig);
         if($this->needCache())
         {
          ob_start();
         }
         extract($this->value, EXTR_OVERWRITE);
         if(!is_file($compileFile) || fileatime($compileFile)  filemtime($this->path()))
         {
          $this->compileTool->value = $this->value;
          $this->compileTool->compile();
          include $compileFile;
         }
         else
         {
          include $compileFile;
         }
         if($this->needCache())
         {
          $message = ob_get_contents();
          file_put_contents($cacheFile, $message);
         }
       }
       else
       {
         readfile($cacheFile);
         $this->debug['cached'] = 'true';
       }
       $this->debug['spend'] = microtime(true) - $this->debug['begin'];
       $this->debug['count'] = count($this->value);
       $this->debug_info();
      }
      public function debug_info()
      {
       if($this->arrayConfig['debug'] === true)
       {
         echo "br/>", '-------------------- debug_info--------------', "br/>";
         echo '程序运行日期:', date("Y-m-d h:i:s"), "br/>";
         echo '模板解析耗时:', $this->debug['spend'], '秒', "br/>";
         echo '模板包含标签数目:', $this->debug['count'], "br/>";
         echo '是否使用静态缓存:', $this->debug['cached'], "br/>";
         echo '模板引擎实例参数:', var_dump($this->getConfig());
       }
      }
      /**
      * 清楚缓存的html文件
      * @return [type] [description]
      */
      public function clean()
      {
       if($path === null)
       {
         $path = $this->arrayConfig['compileDir'];
         $path = glob($path.'* '.$this->arrayConfig['suffix_cache']);
       }
       else
       {
         $path = $this->arrayConfig['compileDir'].md5($path).$this->arrayConfig['suffix_cache'];
       }
       foreach ((array)$path as $v) {
         unlink($v);
       }
      }
    }
    

    test.php

    ?php
    include 'Template.class.php';
    $tpl = new Template(array('debug' => true));
    $tpl->assign('data', 'hello world');
    $tpl->assign('person', 'htGod');
    $tpl->assign('data1', 3);
    $arr = array(1,2,3,4,'5',6);
    $tpl->assign('b', $arr);
    $tpl->show('member');
    
    

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP模板技术总结》、《PHP基于pdo操作数据库技巧总结》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • php+mysql开发的最简单在线题库(在线做题系统)完整案例
    • PHP实现的pdo连接数据库并插入数据功能简单示例
    • 浅谈php调用python文件
    • PHP数据对象映射模式实例分析
    • 为Plesk PHP7启用Oracle OCI8扩展方法总结
    • PHP中ltrim()函数的用法与实例讲解
    • 微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
    • PHP微商城开源代码实例
    • PHP简单验证码功能机制实例详解
    • PHP中md5()函数的用法讲解
    上一篇:为Plesk PHP7启用Oracle OCI8扩展方法总结
    下一篇:PHP数据对象映射模式实例分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP模版引擎原理、定义与用法实例 PHP,模版,引擎,原理,定义,