模板引擎作为视图层和模型曾分离的一种解决方案。

首先我们新建一个Template.class.php 的文件 '.m', //设置模板文件'templateDir' => 'template/', //设置模板所在的文件夹'compileDir' => 'cache','debug' => false,//设置编译后存放的目录'cache_htm' => true,//是否需要编译成静态的html文件'suffix_cache'=> '.htm',//编译后的文件后缀'cache_time' =>2000,// 多长时间自动更新'php_turn' =>false,//是否支持原生的php代码'cache_control' => 'control.dat',);private $compileTool;//编译器public $filename;//模板文件名称private $value =array();//值栈static private $instance = null;public $debug = array();//调试信息public function __construct($arrayConfig =array()){ //返回当前UNIX时间戳和微妙数$this->debug['begin'] = microtime(true);$this->arrayConfig =$arrayConfig+$this->arrayConfig;$this->getPath();if(!is_dir($this->arrayConfig['templateDir'])){exit("template isnt not found");}if(!is_dir($this->arrayConfig['compileDir'])){mkdir($this->arrayConfig['compileDir'],0770,true);}include("Compile.class.php");//$this->compileTool = new Compile;}/**路径处理为绝对路径*/public function getPath(){$this->arrayConfig['templateDir'] = strtr(realpath($this->arrayConfig['templateDir']),'\\','/').'/';$this->arrayConfig['compileDir'] = strtr(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){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;}}}/*** 获取模板文件的路径**/public function path(){return $this->arrayConfig['templateDir'].$this->filename.$this->arrayConfig['suffix'];}/***是否需要缓存**/public function needCache(){return $this->arrayConfig['cache_htm'];}/***是否需要重新生成缓存文件**/public function reCache($file){$flag = false;//生成缓存文件$cacheFile = $this->arrayConfig['compileDir'].md5(@$filename).'.'.'php';//var_dump($cacheFile);if($this->arrayConfig['cache_htm']===true){//设置timeflag (判断当前时间-模板文件上次修改的时间)是否小于设置的缓存时间//如果小于则返回TRUE$timeFlag = (time()-@filemtime($cacheFile))arrayConfig['cache_time']?true:false;//1,判断缓存文件是否存在,//2,缓存文件是否有内容//3,时间是否在设置的缓存时间之内if(!is_file($cacheFile)&&filesize($cacheFile)>1&&$timeFlag){$flag = true;}else{$flag = false;}}return $flag;}/***显示模板**/public function show($file){$this->filename =$file;if(!is_file($this->path())){exit('找不到相对应的模板');}$compileFile = $this->arrayConfig['compileDir'].'/'.md5(@$filename).'.php';$cacheFile = $this->arrayConfig['compileDir'].md5(@$filename).'.htm';//echo $compileFile;//echo $cacheFile;if($this->reCache($file)===false){$this->debug['cached'] = 'false';//var_dump($compileFile);$this->compileTool = new Compile($this->path(),$compileFile,$this->arrayConfig);if($this->needCache()){//是否需要缓存ob_start();}//函数从数组中把变量导入到当前的符号表中extract($this->value,EXTR_OVERWRITE);//判断 文件是否存在,生成文件的修改时间是否小于模板文件修改时间if(@is_file($compileFile)||filemtime($compileFile)path())){$this->compileTool->vars = $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();/*var_dump($compileFile);thisvar_dump($this->path());if(!is_file($compileFile)){mkdir($this->arrayConfig['compileDir']); //此处若存在需要判断$this->compileTool->compile($this->path(),$compileFile);readfile($compileFile);}else{readfile($compileFile);}*/}/***debug 调试函数**/public function debug_info(){//$this->arrayConfig['debug']=false;if($this->arrayConfig['debug']===true){var_dump($this);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());}}/******清楚缓存的文件*****/public function clean($path = null){if($path = null){$path = $this->arrayConfig['CompileDir'];$path = glob($path.'*'.$this->arrayConfig['suffix_cache']);//glob 函数返回匹配指定的文件夹目录}else{$path = $this->arrayConfig['compileDir'].md5($path).'.htm';foreach((array)$path as $v){//删除unlink($v);}}}}

新建一个 Compile.class.php 翻译模板文件 template = $template;$this->comfile = $compileFile;$this->content = file_get_contents($template);if($config['php_turn']===false){//echo "123";//$this->T_R[]="";}//echo "123";//正则匹配 {$xxx} 格式$this->T_P[]="#\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}#";$this->T_R[]="value['\\1'];?>";}public function compile(){$this->c_var2();//$this->c_staticFile();//var_dump($this);file_put_contents($this->comfile,$this->content);}public function c_var2(){// 将{$xxx} 替换为$this->content = preg_replace($this->T_P,$this->T_R,$this->content);}public function c_staticFile(){$this->content =preg_replace('#\{\!(.*?)\!\}#','',$this->content);}public function __set($name,$value){$this->$name = $value;}public function __get($name){return $this->$name;}}

新建一个测试文件 test.php false,'debug'=>false));$tpl->assign('data','hello world');$tpl->show('member');//var_dump($tpl->getConfig());

模板文件member.m welcome{$data}

显示截图

借鉴 php核心技术与最佳实践

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 简单模板引擎,PHP 实现简单的模板引擎相关推荐

  1. beetl java例子_初识Java模板引擎Beetl之简单示例

    以前没用过模板引擎,没去关注过,今天正好看到,简单看了一下,写个简单的示例,记录一下: 首先,Beetl 是 Bee Template language的缩写,是新一代的模板引擎,它功能强大,拥有主流 ...

  2. 模板引擎---template的简单使用

    (1)art-template的实现步骤 (1)导入template(2)定义数据(3)定义模板(4)调用template(5)渲染HTML结构 (2)模板引擎的语法 template('模板的Id' ...

  3. 模板引擎ejs与html,后台模板引擎ejs与前台模板引擎artTemplate的简单介绍

    动态网页是指前端页面当中的数据内容来源于后台数据库,前端的html代码会随着后台数据的变化而变化,是动态生成的.制作动态网页有两种方式,一种方式是在后台拿到前端的html模板,利用后台模板引擎(如ej ...

  4. 分享一个简单好看的科技公司官网模板-纯HTML+CSS

    分享一个简单好看的科技公司官网模板-纯HTML+CSS 首页: 首页的HTML源码部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  5. Unity3D 游戏引擎之构建简单的游戏世界(三)

    Unity3D 游戏引擎之构建简单的游戏世界 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archi ...

  6. 用HTML+CSS做一个漂亮简单的个人网页~个人相册介绍个人主页模板(6个页面) ~学生HTML个人网页作业作品~

    用HTML+CSS做一个漂亮简单的个人网页 ~ 个人相册介绍个人主页模板(6个页面) 学生HTML个人网页作业作品 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作 ...

  7. 用HTML+CSS做一个漂亮简单的个人网页~个人相册介绍个人主页模板(6个页面) ~学生HTML个人网页作业作品~...

    用HTML+CSS做一个漂亮简单的个人网页 ~ 个人相册介绍个人主页模板(6个页面) 学生HTML个人网页作业作品 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作 ...

  8. 简单的新闻发布网站设计模板_如何创建简单有效的设计模板

    简单的新闻发布网站设计模板 How to create simple and effective design template Today we are going to use jQuery mo ...

  9. HTML5期末大作业:花店购物网站设计——花店购物网站源码(27页) 学生动花店购物页设计模板下载 植物大学生HTML网页制作作品 简单网页设计成品 dreamweaver学生网站模板

    HTML5期末大作业:花店购物网站设计--花店购物网站源码(27页) 学生动花店购物页设计模板下载 植物大学生HTML网页制作作品 简单网页设计成品 dreamweaver学生网站模板 常见网页设计作 ...

  10. oa人员导入模板_巧用OA系统模板办公,让重复的事情简单做

    是什么让我们的工作变得低效? 机械的重复绝对算得上一项.有时候,我们不得不花费大量的时间去进行信息的重复填写.格式的重复校对,却没有进行相应模板的总结,让简单的事情变得复杂. 那么,如何才能告别低效工 ...

最新文章

  1. 在Windows系统利用IP地址登陆Linux服务器
  2. 【Linux】一步一步学Linux——mkdir命令(21)
  3. 获取Sql服务器列表 (C#)
  4. 解决uni-app官方弹框popup关闭不了问题;/pages/extUI/popup/popup;uni-app弹框popup打开调用事件。unin-app弹框封装;
  5. 闪电shader_【Shader案例】怎样做出自然的闪电
  6. php常用函数、算法,PHP常用函数和常量
  7. 命名空间函数用法及例子
  8. PHP 修改配置文件后重启命名
  9. Ubuntu默认Python版本选择
  10. 学习笔记(20):Google开发专家带你学 AI:入门到实战(Keras/Tensorflow)(附源码)-深度学习“四件套”:数据、模型、损失函数与优化器...
  11. 女程序员写代码被骂,把领导萌死,成功治愈“选择困难症”
  12. 百度Sugar数据可视化领域优势地位因何受到挑战?
  13. HNU 12814 SIRO Challenge(最短路+状态压缩+dp)
  14. Kettle连接mysql 驱动报 Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found, make sure the ‘MySQL‘..
  15. Softmax-with-Loss层的计算图 | Softmax梯度推导 | Loss损失函数
  16. 传输线方程与终端加载的无损耗传输线
  17. 基于java+jsp+ssm工程车辆租赁系统
  18. 检验方法的验证、确认步骤及详细计算方法
  19. ExoPlayer官方中文使用文档
  20. Linux部署JupyterHub实现多用户使用Jupyterlab

热门文章

  1. 数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(上)
  2. 周志华教授:关于深度学习的一点思考
  3. PyTorch 51.BatchNorm和Dropout层的不协调现象
  4. 上海交大:我们做了一个医疗版MNIST数据集,发现常见AutoML算法没那么好用
  5. 博士大佬整理的机器学习算法知识手册 | 附PDF下载
  6. Python面试必备—分布式爬虫scrapy+redis解析
  7. Servlet 传输中文乱码解决方法
  8. Python基础学习!基本元素,数字,字符串以及变量
  9. 7 大主题!梳理神经网络中 Normalization 的发展历程
  10. 项目实践 | 行人跟踪与摔倒检测报警