当前位置:编程学习 > > 正文

php开发中用什么模板(PHP模版引擎原理、定义与用法实例)

时间:2022-03-31 20:06:07类别:编程学习

php开发中用什么模板

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

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

template存放模版源文件

模版编译工具类

Compline.class.php

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • <?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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • <?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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • <?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程序设计有所帮助。

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐