前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP模版引擎原理、定义与用法实例

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

作者头像
砸漏
发布2020-10-21 15:21:29
5960
发布2020-10-21 15:21:29
举报
文章被收录于专栏:恩蓝脚本

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

template存放模版源文件

模版编译工具类

Compline.class.php

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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程序设计有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档