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

php制作简单模版引擎

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

PHP模板引擎就是一个PHP类库,使用它可以使PHP代码和HTML代码进行分离,使代码的可读性和维护性得到显著提高。而且这样做的好处是,让美工专心设计HTML前台页面,程序员专心去写PHP业务逻辑。因此,模化引擎很适合公司的Web开发团队使用,使每个人都能发挥其特长

下面我们就来看看如何简单的来实现php的模板引擎

parser.class.php

_tpl = file_get_contents($_tplFile)) {      exit('ERROR:模版文件读取错误');    }  }     // 解析普通变量  private function parvar()  {    $_patten = '//';    if (preg_match($_patten,$this->_tpl)) {      $this->_tpl = preg_replace($_patten, "_vars['$1'];?>",$this->_tpl);    }  }   //解析IF语句  private function parif(){    $_pattenif = '//';    $_pattenElse = '//';    $_pattenEndif = '//';    if (preg_match($_pattenif,$this->_tpl)) {      if (preg_match($_pattenEndif,$this->_tpl)) {        $this->_tpl = preg_replace($_pattenif,"_vars['$1']){?>",$this->_tpl);        $this->_tpl = preg_replace($_pattenEndif,"",$this->_tpl);        if (preg_match($_pattenElse,$this->_tpl)) {          $this->_tpl = preg_replace($_pattenElse,"",$this->_tpl);        }      }else{      echo 'ERROR:IF语句没有关闭!';      }    }  }   //PHP注释解析   private function parCommon(){    $_pattenCommon = '//';    if (preg_match($_pattenCommon,$this->_tpl)) {      $this->_tpl = preg_replace($_pattenCommon,"",$this->_tpl);    }  }     //解析foreach语句  private function parForeach(){    $_pattenForeach = '//';    $_pattenForeachEnd = '//';    $_pattenForeachValue = '//';    if (preg_match($_pattenForeach,$this->_tpl)) {      if (preg_match($_pattenForeachEnd,$this->_tpl)) {        $this->_tpl = preg_replace($_pattenForeach, "_vars['$1'] as \$$2=>\$$3) {?>", $this->_tpl);        $this->_tpl = preg_replace($_pattenForeachEnd, "", $this->_tpl);        if (preg_match($_pattenForeachValue, $this->_tpl)) {          $this->_tpl = preg_replace($_pattenForeachValue,"",$this->_tpl);        }      }else{      echo 'ERROR:Foreach语句没有关闭!';        }    }  }   //解析include方法  private function parInclude(){    $_pattenInclude = '//';    if (preg_match($_pattenInclude,$this->_tpl,$_file,$_file)) {      if (!file_exists($_file[1])||empty($_file)) {        echo 'ERROR:包含文件出错!';      }      $this->_tpl = preg_replace($_pattenInclude,"",$this->_tpl);    }  }   //解析系统变量方法  private function parConfig(){    $_pattenConfig = '//';    if (preg_match($_pattenConfig,$this->_tpl)) {      $this->_tpl = preg_replace($_pattenConfig,"_config['$1'];?>",$this->_tpl);    }  }  // 对外公共方法  public function compile($_path)  {    // 解析模版文件    $this->parvar();    $this->parif();    $this->parForeach();    $this->parInclude();    $this->parCommon();    $this->parConfig();    // 生成编译文件    if (! file_put_contents($_path, $this->_tpl)) {      exit('ERROR:编译文件生成错误!');    }  }}?>

Templates.class.php

";      if (!is_dir(TPL_DIR)) {        mkdir(TPL_DIR);        echo '模版目录'.TPL_DIR.'建立'."
"; } if (!is_dir(TPL_C_DIR)) { mkdir(TPL_C_DIR); echo '编译目录'.TPL_C_DIR.'建立'."
"; } if (!is_dir(CACHE)) { mkdir(CACHE); echo '缓存目录'.CACHE.'建立'."
"; } if (!is_dir(CONFIG)) { mkdir(CONFIG); echo '缓存目录'.CONFIG.'建立'."
"; } exit(); } //保存系统变量 $_sxe = simplexml_load_file(CONFIG.'/config.xml'); $_tagLib = $_sxe->xpath('/root/taglib'); foreach ($_tagLib as $_tag) { $this->_config["$_tag->name"] = $_tag->value; } } //assign()方法,用于注入变量 public function assign($_var,$_value){ //$_var用于同步模版里的变量名 //$_value表示值 if (isset($_var)&&!empty($_var)) { $this->_vars[$_var] = $_value; }else{ exit('ERROR:设置模版变量!'); } } //display()方法 public function display($_file) { $_tplFile = TPL_DIR . $_file; // 判断文件是否存在 if (! file_exists($_tplFile)) { echo 'ERROR:模版文件不存在!自动创建Index.tpl模版文件!'; file_put_contents($_tplFile,'Index'); exit(); } //生成编译文件 $_path = TPL_C_DIR.md5($_file).'-'.$_file.'.php'; //缓存文件 $_cacheFile = CACHE.md5($_file).'-'.$_file.'.html'; //当第二次运行相同文件,直接载入缓存文件 if (IS_CACHE) { //判断缓存文件和编译文件都存在 if (file_exists($_cacheFile)&&file_exists($_path)) { //判断模版文件是否修改过 if (filemtime($_path)>=filemtime($_tplFile)&&filemtime($_cacheFile)>=filemtime($_path)) { include $_cacheFile; echo ''; return; } } } //当编译文件不存在或者文件发生改变则重新生成 if (!file_exists($_path)||filemtime($_path)compile($_path); } //载入编译文件 include $_path; if (IS_CACHE) { //获取缓冲区数据 file_put_contents($_cacheFile,ob_get_contents()); //清楚缓冲区 ob_end_clean(); //载入缓存文件 include $_cacheFile; } }}?>

templates.php

display('index.tpl');?>

templates/index.tpl

              <!-- {WebName} -->       123321
...
系统变量
普通变量

config/config.xml

      WebName    XXX网站  

您可能感兴趣的文章:

  • ThinkPHP模版引擎之变量输出详解
  • php smarty模版引擎中变量操作符及使用方法
  • php smarty模版引擎中的缓存应用
  • php smarty模版引擎中的缓存应用
  • php smarty 二级分类代码和模版循环例子
  • php中smarty实现多模版网站的方法
  • PHP Smarty模版简单使用方法
  • WordPress中用于检索模版的相关PHP函数使用解析
  • PHP模版引擎原理、定义与用法实例


  • 上一条:
    php 实现进制相互转换
    下一条:
    非常有用的9个PHP代码片段
  • 昵称:

    邮箱:

    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个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(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交流群

    侯体宗的博客