侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

php  /  管理员 发布于 7年前   158

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

template存放模版源文件

模版编译工具类

Compline.class.php

template = $template;   $this->comfile = $compileFile;   $this->content = file_get_contents($template);   if($config['php_turn'] === false)   {     $this->T_P[] = "/<\?(=|php|)(.+?)\?>/is";     $this->T_R[] = "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[] = "value['\\1']; ?>";   $this->T_R[] = "value['\\2'] as \$K => \$V) { ?>";   $this->T_R[] = "";   $this->T_R[] = "";   $this->T_R[] = "";   $this->T_R[] = "";   $this->T_R[] = "";   $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('/\{\!(.* ?)\!\}/', '', $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

 '.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 "
", '-------------------- debug_info--------------', "
"; echo '程序运行日期:', date("Y-m-d h:i:s"), "
"; echo '模板解析耗时:', $this->debug['spend'], '秒', "
"; echo '模板包含标签数目:', $this->debug['count'], "
"; echo '是否使用静态缓存:', $this->debug['cached'], "
"; 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

 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()函数的用法讲解


  • 上一条:
    PHP数据对象映射模式实例分析
    下一条:
    为Plesk PHP7启用Oracle OCI8扩展方法总结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客