首页 > 编程 > PHP > 正文

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

2019-11-21 20:03:05
字体:
来源:转载
供稿:网友

本文实例讲述了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[] = "<? //1//2? >";   }   //{$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

<?phpinclude '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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表