当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-14 12:38:46 浏览: 评论:0 

这篇文章主要介绍了PHP模版引擎原理、定义与用法,结合实例形式分析了php模板引擎相关的模板编译、缓存处理、变量替换等操作技巧,需要的朋友可以参考下。

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

template存放模版源文件

模版编译工具类

Compline.class.php

  1. <?php 
  2. /** 
  3. * 模板编译工具类 
  4. */ 
  5. class Compile 
  6.   private $template;     //带编译文件 
  7.   private $content;      //需要替换的文本 
  8.   private $comfile;      //编译后的文件 
  9.   private $left = '{';     //左界定符 
  10.   private $right = '}';    //右界定符 
  11.   private $value = array();   //值栈 
  12.   private $php_turn
  13.   private $T_P = array(); 
  14.   private $T_R = array(); 
  15.   public function __construct($template$compileFile$config
  16.   { 
  17.    $this->template = $template
  18.    $this->comfile = $compileFile
  19.    $this->content = file_get_contents($template); 
  20.    if($config['php_turn'] === false) 
  21.    { 
  22.      $this->T_P[] = "/<\?(=|php|)(.+?)\?>/is"
  23.      $this->T_R[] = "&lt;? \\1\\2? &gt"
  24.    } 
  25.    //{$var} 
  26.    $this->T_P[] = "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/"
  27.    //{foreach $b}或者{loop $b} 
  28.    $this->T_P[] = "/\{(loop|foreach) \\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/i"
  29.    //{[K|V]} 
  30.    $this->T_P[] = "/\{([K|V])\}/"
  31.    //{/foreach}或者{\loop}或者{\if} 
  32.    $this->T_P[] = "/\{\/(loop|foreach|if)}/i"
  33.    //{if (condition)} 
  34.    $this->T_P[] = "/\{if (.* ?)\}/i"
  35.    //{(else if | elseif)} 
  36.    $this->T_P[] = "/\{(else if|elseif) (.* ?)\}/i"
  37.    //{else} 
  38.    $this->T_P[] = "/\{else\}/i"
  39.    //{#...# 或者 *...#,注释} 
  40.    $this->T_P[] = "/\{(\#|\*)(.* ?)(\#|\*)\}/"
  41.    $this->T_R[] = "<?php echo \$this->value['\\1']; ?>"
  42.    $this->T_R[] = "<?php foreach ((array)\$this->value['\\2'] as \$K => \$V) { ?>"
  43.    $this->T_R[] = "<?php echo \$\\1; ?>"
  44.    $this->T_R[] = "<?php } ?>"
  45.    $this->T_R[] = "<?php if (\\1) { ?>"
  46.    $this->T_R[] = "<?php }else if (\\2) { ?>"
  47.    $this->T_R[] = "<?php }else{ ?>"
  48.    $this->T_R[] = ""
  49.   } 
  50.   public function compile() 
  51.   { 
  52.    $this->c_all(); 
  53.    $this->c_staticFile(); 
  54.    file_put_contents($this->comfile, $this->content); 
  55.   } 
  56.   public function c_all() 
  57.   { 
  58.    $this->content = preg_replace($this->T_P, $this->T_R, $this->content); 
  59.   } 
  60.   /** 
  61.   * 加入对JavaScript文件的解析 
  62.   * @return [type] [description] 
  63.   */ 
  64.   public function c_staticFile() 
  65.   { 
  66.    $this->content = preg_replace('/\{\!(.* ?)\!\}/''<script src=\\1'.'?t='.time().'></script>'$this->content); 
  67.   } 
  68.   public function __set($name$value
  69.   { 
  70.    $this->$name = $value
  71.   } 
  72.   public function __get($name
  73.   { 
  74.    if(isset($this->$name)) 
  75.    { 
  76.      return $this->$name
  77.    } 
  78.    else 
  79.    { 
  80.      return null; 
  81.    } 
  82.   } 

Template.class.php

  1. <?php 
  2. /** 
  3. * Template 
  4. */ 
  5. class Template 
  6.   private $arrayConfig = array
  7.    'suffix'   => '.tpl',  //模板的后缀 
  8.    'templateDir' => 'template/'//模板所在的文件夹 
  9.    'compileDir'  => 'cache/',  //编译后存放的目录 
  10.    'cache_html'  => true,   //是否需要编译成静态的html文件 
  11.    'suffix_cache' => '.html',  //设置编译文件的后缀 
  12.    'cache_time'  => 7200,   //设置多长时间自动更新 
  13.    'php_turn'  => true,   //设置是否支持php原生代码 
  14.    'debug'     => false, 
  15.    ); 
  16.   public $file;         //模板文件名,不带路径 
  17.   public $debug = array();     //调试信息 
  18.   private $value = array();    //值栈 
  19.   private $compileTool;      //编译器 
  20.   private $controlData = array(); 
  21.   static private $instance = null;  //模板类对象 
  22.   public function __construct($arrayConfig = array()) 
  23.   { 
  24.    $this->debug['begin'] = microtime(true); 
  25.    $this->arrayConfig = array_merge($this->arrayConfig, $arrayConfig); 
  26.    $this->getPath(); 
  27.    if(!is_dir($this->arrayConfig['templateDir'])) 
  28.    { 
  29.      exit("template dir isn't found!"); 
  30.    } 
  31.    if(!is_dir($this->arrayConfig['compileDir'])) 
  32.    { 
  33.      if(strtoupper(substr(PHP_OS,0,3)) === 'WIN'
  34.      { 
  35.       mkdir($this->arrayConfig['compileDir']); 
  36.      } 
  37.      else 
  38.      { 
  39.       mkdir($this->arrayConfig['compileDir'], 0770, true); 
  40.      } 
  41.    } 
  42.    include('Compile.class.php'); 
  43.   } 
  44.   public function getPath() 
  45.   { 
  46.    $this->arrayConfig['templateDir'] = strstr(realpath($this->arrayConfig['templateDir']), '\\', '/').'/'; 
  47.    $this->arrayConfig['compileDir'] = strstr(realpath($this->arrayConfig['compileDir'])), '\\', '/').'/'; 
  48.   } 
  49.   /** 
  50.   * 取得模板引擎的实例 
  51.   */ 
  52.   public static function getInstance() 
  53.   { 
  54.    if(is_null(self::$instance)) 
  55.    { 
  56.      self::$instance = new Template(); 
  57.    } 
  58.    return self::$instance
  59.   } 
  60.   /** 
  61.   * 单独设置引擎参数 
  62.   * 也支持一次性设置多个参数 
  63.   */ 
  64.   public function setConfig($key$value = null) 
  65.   { 
  66.    if(is_array($key)) 
  67.    { 
  68.      $this->arrayConfig = $key + $this->arrayConfig; 
  69.    } 
  70.    else 
  71.    { 
  72.      $this->arrayConfig[$key] = $value
  73.    } 
  74.   } 
  75.   /** 
  76.   * 获取当前模板引擎配置,仅供调试使用 
  77.   */ 
  78.   public function getConfig($key = null) 
  79.   { 
  80.    if($key && array_key_exists($key$this->arrayConfig)) 
  81.    { 
  82.      return $this->arrayConfig[$key]; 
  83.    } 
  84.    else 
  85.    { 
  86.      return $this->arrayConfig; 
  87.    } 
  88.   } 
  89.   /** 
  90.   * 注入单个变量 
  91.   */ 
  92.   public function assign($key$value
  93.   { 
  94.    $this->value[$key] = $value
  95.   } 
  96.   /** 
  97.   * 注入数组变量 
  98.   */ 
  99.   public function assignArray($array
  100.   { 
  101.    if(is_array($array)) 
  102.    { 
  103.      foreach ($array as $k => $v) { 
  104.       $this->value[$k] = $v
  105.      } 
  106.    } 
  107.   } 
  108.   /** 
  109.   * 获取模板的位置 
  110.   * @return [type] [description] 
  111.   */ 
  112.   public function path() 
  113.   { 
  114.    return $this->arrayConfig['templateDir'].$this->file.$this->arrayConfig['suffix']; 
  115.   } 
  116.   /** 
  117.   * 判断配置文件是否要求缓存 
  118.   */ 
  119.   public function needCache() 
  120.   { 
  121.    return $this->arrayConfig['cache_html']; 
  122.   } 
  123.   /** 
  124.   * 判断是否需要缓存 
  125.   */ 
  126.   public function reCache($file
  127.   { 
  128.    $flag = false; 
  129.    $cacheFile = $this->arrayConfig['compileDir'].md5($file).$this->arrayConfig['suffix_cache']; 
  130.    if($this->arrayConfig['cache_html'] === true) 
  131.    { 
  132.      //需要缓存 
  133.      $timeFlag = (time() - @filemtime($cacheFile)) < $this->arrayConfig['cache_time'] ? true : false; 
  134.      if(is_file($cacheFile) && filesize($cacheFile) > 1 && $timeFlag
  135.      { 
  136.       //缓存存在且未过期 
  137.       $flag = true; 
  138.      } 
  139.      else 
  140.      { 
  141.       $flag = false; 
  142.      } 
  143.    } 
  144.    return $flag
  145.   } 
  146.   /** 
  147.   * 展示模板 
  148.   */ 
  149.   public function show($file
  150.   { 
  151.    $this->file = $file
  152.    if(!is_file($this->path())) 
  153.    { 
  154.      exit('找不到对应的模板'); 
  155.    } 
  156.    $compileFile = $this->arrayConfig['compileDir'].md5($file).'.php'
  157.    $cacheFile = $this->arrayConfig['compileDir'].md5($file).$this->arrayConfig['suffix_cache']; 
  158.    if($this->reCache($file) === false) 
  159.    { 
  160.      //如果需要缓存 
  161.      $this->debug['cached'] = 'false'
  162.      $this->compileTool = new Compile($this->path(), $compileFile$this->arrayConfig); 
  163.      if($this->needCache()) 
  164.      { 
  165.       ob_start(); 
  166.      } 
  167.      extract($this->value, EXTR_OVERWRITE); 
  168.      if(!is_file($compileFile) || fileatime($compileFile) < filemtime($this->path())) 
  169.      { 
  170.       $this->compileTool->value = $this->value; 
  171.       $this->compileTool->compile(); 
  172.       include $compileFile
  173.      } 
  174.      else 
  175.      { 
  176.       include $compileFile
  177.      } 
  178.      if($this->needCache()) 
  179.      { 
  180.       $message = ob_get_contents(); 
  181.       file_put_contents($cacheFile$message); 
  182.      } 
  183.    } 
  184.    else 
  185.    { 
  186.      readfile($cacheFile); 
  187.      $this->debug['cached'] = 'true'
  188.    } 
  189.    $this->debug['spend'] = microtime(true) - $this->debug['begin']; 
  190.    $this->debug['count'] = count($this->value); 
  191.    $this->debug_info(); 
  192.   } 
  193.   public function debug_info() 
  194.   { 
  195.    if($this->arrayConfig['debug'] === true) 
  196.    { 
  197.      echo "<br/>"'-------------------- debug_info--------------'"<br/>"
  198.      echo '程序运行日期:'date("Y-m-d h:i:s"), "<br/>"
  199.      echo '模板解析耗时:'$this->debug['spend'], '秒'"<br/>"
  200.      echo '模板包含标签数目:'$this->debug['count'], "<br/>"
  201.      echo '是否使用静态缓存:'$this->debug['cached'], "<br/>"
  202.      echo '模板引擎实例参数:', var_dump($this->getConfig()); 
  203.    } 
  204.   } 
  205.   /** 
  206.   * 清楚缓存的html文件 
  207.   * @return [type] [description] 
  208.   */ 
  209.   public function clean() 
  210.   { 
  211.    if($path === null) 
  212.    { 
  213.      $path = $this->arrayConfig['compileDir']; 
  214.      $path = glob($path.'* '.$this->arrayConfig['suffix_cache']); 
  215.    } 
  216.    else 
  217.    { 
  218.      $path = $this->arrayConfig['compileDir'].md5($path).$this->arrayConfig['suffix_cache']; 
  219.    } 
  220.    foreach ((array)$path as $v) { 
  221.      unlink($v); 
  222.    } 
  223.   } 

test.php

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

Tags: PHP模版引擎 PHP模版定义

分享到: