这是模板文件

<?php
class Tpl
{//模版文件的路径protected $viewDir='./view/';//生成缓存文件的路径protected $cacheDir='./cache/';//过期时间protected $lifeTime=3600;//用来存放显示变量的数组protected $vars=array();//构造方法对成员变量进行初始化function __construct($viewDir=null,$cacheDir=null,$lifeTiem=null){if(!empty($viewDir)){if($this->checkDir($viewDir)){$this->viewDir=$viewDir;}}if(!empty($cacheDir)){if($this->checkDir($cacheDir)){$this->cacheDir=$cacheDir;}}if(!empty($lifeTiem)){$this->lifeTiem=$lifeTiem;}}//判断目录路径是否为路径或文件夹protected function checkDir($dirPath){if(!file_exists($dirPath) || !is_dir($dirPath)){return mkdir($dirPath,0755,true);}if(!is_writable($dirPath) || is_readable($dirPath)){return chmod($dirPath,0755);}return true;}//需要对外公开的方法//分配变量方法//$title='日本';$tpl->assign('title',$title);function assign($key,$value){$this->vars[$key]=$value;}//展示缓存文件方法/**$viewName:模板文件名*$isInclude:模板文件是仅仅需要编译,还是先编译再包含进来*$uri:index.php?page=1,page=1就是那个uri,为了让缓存的文件名不重复,将文件名和uri拼接起来再md5一下,生成缓存的文件名*/function display($viewName,$isInclude=true,$uri=null){//拼接模板文件的全路径$viewPath=rtrim($this->viewDir,'/').'/'.$viewName;if(!file_exists($viewPath)){die('模板文件不存在');}//拼接缓存文件的全路径$cacheName=md5($viewName.$uri).'.php';$cachePath=rtrim($this->cacheDir,'/').'/'.$cacheName;if(!file_exists($cachePath)){//根据缓存文件全路径,判断缓存文件是否存在//编译模板文件$php=$this->compile($viewPath);//写入文件,生成缓存文件file_put_contents($cachePath,$php);}else{//如果缓存文件不存在,编译模板文件生成缓存文件//如果缓存文件存在,1、判断缓存文件是否过期,2、判断模板文件是否被修改过,如果被修改过,缓存文件需要重新生成$isTimeout=(filectime($cachePath)+$this->lifeTime) > time() ? false : true;$isChange=filemtime($viewPath) > filemtime($cachePath)?true:false;if($isTimeout || $isChange){$php=$this->compile($viewPath);file_put_contents($cachePath,$php);}}//判断缓存文件是否需要包含进来if($isInclude){//将变量解析出来extract($this->vars);//展示缓存文件include $cachePath;}}//compile方法,编译html文件protected function compile($filePath){//读取文件内容$html=file_get_contents($filePath);//正则替换$array=['{$%%}'=>'<?=$\1; ?>','{foreach %%}'=>'<?php foreach (\1): ?>','{/foreach}'=>'<?php endforeach?>','{include %%}'=>'','{if %%}'=>'<?php if (\1): ?>','{for %%}'=>'<?php for (\1): ?>'];//遍历数组,将%%全部修改为 .+ ,然后执行正则替换foreach($array as $key=>$value){//生成正则表达式$pattern='#'.str_replace('%%','(.+?)',preg_quote($key,'#')).'#';//实现正则替换if(strstr($pattern,'include')){$html=preg_replace_callback($pattern,[$this,'parseInclude'],$html);}else{//执行替换$html=preg_replace($pattern,$value,$html);}}return $html;}protected function parseInclude($data){//将文件名两的引号去除掉,preg_replace_callback()中$data[1]表示获取到第1个子集,$data[0]表示全部$fileName = trim($data[1],'\'"');//然后不包含文件生成缓存$this->display($fileName,false);//拼接缓存文件全路径$cacheName=md5($fileName).'.php';$cachePath=rtrim($this->cacheDir,'/').'/'.$cacheName;return '<?php include "' .$cachePath.'"?>';}
}

这是测试文件test.php

<?php
include "Tpl.php";
$tpl=new Tpl();
$title='这是标题';
$data=['足球','世界杯'];$head="这次世界谁是冠军";
$tpl->assign('title',$title);
$tpl->assign('data',$data);
$tpl->assign('head',$head);
$tpl->display('test.html');
?>

这是在view里面的test.html文件

<html>
<head>
<meta charset="utf-8">
<title>{$title}</title>
</head>
<body>
{include head.html}
{foreach $data as $value}{$value}<br/>
{/foreach}
</body>
</html>

这是在view里面的head.html文件

<div>{$head}</div>

这简单的模板文件可以分别写出简单的功能板块
如头部文件、底部文件、及登陆块等

php写简单的模板tpl相关推荐

  1. 自己写php模板引擎,如何用php编写一个简单的模板引擎(附代码)

    php web开发中广泛采取mvc的设计模式,controller传递给view层的数据,必须通过模板引擎才能解析出来.实现一个简单的仅仅包含if,foreach标签,解析$foo变量的模板引擎. 编 ...

  2. Java将对象信息写到word模板中(全网最简单版)

    Java将对象信息写到word模板中 一.首先进行依赖的导入 <!-- 证书模板写入信息 --><dependency><groupId>com.deepoove& ...

  3. 实现一个简单的模板引擎,输入模板和数据,输出html

    实现一个简单的模板引擎,输入模板和数据,输出html 示例: 输入: "<div>{{$1}}({{$2}}){{$3}}</div>",["第一 ...

  4. 如何写简单实用的产品需求文档PRD

    文章目录 如何写简单实用的产品需求文档PRD 前言 产品需求文档模板 1. 概述 1.1 产品概述 1.2 典型使用场景 1.3 功能列表 1.4 目标用户 1.5 名词解释 1.6 参考文档 2. ...

  5. 写网站没有模板?这几个可以下载模板的网站,非常惊艳

    写网站没有模板?这几个可以下载模板的网站,非常惊艳 简单粗暴⛽️ HTML5UP 当我第一次打开这个网站的时候,给我惊艳到了,满屏英文丝毫不影响模板的优秀啊

  6. php模板引擎 例子,PHP实现简单的模板引擎功能示例

    本文实例讲述了PHP实现简单的模板引擎功能.分享给大家供大家参考,具体如下: php web开发中广泛采取mvc的设计模式,controller传递给view层的数据,必须通过模板引擎才能解析出来.实 ...

  7. angular2 学习二 最简单的模板

    2019独角兽企业重金招聘Python工程师标准>>> 最简单的模板 组件的View注解用来声明组件的外观,它最重要的属性就是template - 模板. Angular2的模板是兼 ...

  8. http调用如何返回回调函数_Simulink(模型amp;函数调用发生模块)+Guide自写简单系统(五)+StateflowChart回调函数 (二)...

    Simulink:模型&函数调用发生模块 如下所示为模型模块以及函数调用发生模块: 使用模型模块可以双击在模块中选择具体路径中的文件进行配置:在使用时即可对模型提供一个链接的路径: 运行时效果 ...

  9. UI设计干货素材|简单素材模板教你分分钟提高UI设计水平!

    对于初学者来说,设计经常会没有思路 为了保证更优用户体验 更是十八般武艺,样样精通 看看这些优秀的简单素材模板教你分分钟提高UI设计水平! 视觉动效 能有效提升用户满足感,刺激其多次操作 语音援助UI ...

最新文章

  1. 目标10亿部?苹果AR眼镜有望明年登场!传搭载Mac级处理器、4K显示屏
  2. PTA基础编程题目集-6-8 简单阶乘计算
  3. 《Ext JS 高级程序设计》的目录与样张
  4. edHat linux光盘引导,Red Hat Linux 9光盘启动安装过程
  5. 560. 和为K的子数组 974. 和可被 K 整除的子数组 (哈希表)
  6. Angular HTTPClient的使用方法
  7. word插入参考文献、目录及公式对齐方法
  8. 通过JCONSOLE监控TOMCAT的JVM使用情况
  9. 企业呼吁更多关注网络安全
  10. maven 项目 spring mvc + jdbc 配置文件
  11. android studio发包,androidstudio使用gradle打包配置详解.pdf
  12. win7主题破解_VM 15.5虚拟机安装win7系统的流程
  13. 51单片机流水灯画图打板焊元件历程
  14. 小虾米闯江湖服务器维护中,小虾米闯江湖数据总结及中期注意事项一览
  15. 一体化供应链里的「京东答案」
  16. 计算识别率的matlab代码,基于MATLAB神经网络图像识别的高识别率代码
  17. [FFmpeg] AVPacket 的使用记录(初始化、引用、解引用、释放)
  18. 01.07第64期短中线黑马推荐!
  19. Vue学习笔记_组件化
  20. 代码chaid_SPSS术语中英文对照详解

热门文章

  1. 5G MEC边缘云平台架构及商用实践白皮书丨附下载
  2. 瑜伽教学法 | <前屈-下犬式-山式串联口令>,手把手纠正口令不足,教你精准口令的秘诀!
  3. freemodbus源码笔记
  4. HTML中边框的设置
  5. 《项目管理就是这么简单》--读书笔记
  6. Linux ora-12514多实例,Oracle错误 ORA-12514 解决方法
  7. python垃圾邮件识别_Python贝叶斯推理垃圾邮件分类
  8. 基于 OpenCV 的车辆检测系统
  9. 01.java后台三层架构
  10. 讨论无穷积分的敛散性