PHP模版引擎原理、定义与用法实例
本文实例讲述了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[]="<?\\1\\2?>"; } //{$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"; //{(elseif|elseif)} $this->T_P[]="/\{(elseif|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[]=""; } publicfunctioncompile() { $this->c_all(); $this->c_staticFile(); file_put_contents($this->comfile,$this->content); } publicfunctionc_all() { $this->content=preg_replace($this->T_P,$this->T_R,$this->content); } /** *加入对JavaScript文件的解析 *@return[type][description] */ publicfunctionc_staticFile() { $this->content=preg_replace('/\{\!(.*?)\!\}/','',$this->content); } publicfunction__set($name,$value) { $this->$name=$value; } publicfunction__get($name) { if(isset($this->$name)) { return$this->$name; } else { returnnull; } } }
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(); staticprivate$instance=null;//模板类对象 publicfunction__construct($arrayConfig=array()) { $this->debug['begin']=microtime(true); $this->arrayConfig=array_merge($this->arrayConfig,$arrayConfig); $this->getPath(); if(!is_dir($this->arrayConfig['templateDir'])) { exit("templatedirisn'tfound!"); } 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'); } publicfunctiongetPath() { $this->arrayConfig['templateDir']=strstr(realpath($this->arrayConfig['templateDir']),'\\','/').'/'; $this->arrayConfig['compileDir']=strstr(realpath($this->arrayConfig['compileDir'])),'\\','/').'/'; } /** *取得模板引擎的实例 */ publicstaticfunctiongetInstance() { if(is_null(self::$instance)) { self::$instance=newTemplate(); } returnself::$instance; } /** *单独设置引擎参数 *也支持一次性设置多个参数 */ publicfunctionsetConfig($key,$value=null) { if(is_array($key)) { $this->arrayConfig=$key+$this->arrayConfig; } else { $this->arrayConfig[$key]=$value; } } /** *获取当前模板引擎配置,仅供调试使用 */ publicfunctiongetConfig($key=null) { if($key&&array_key_exists($key,$this->arrayConfig)) { return$this->arrayConfig[$key]; } else { return$this->arrayConfig; } } /** *注入单个变量 */ publicfunctionassign($key,$value) { $this->value[$key]=$value; } /** *注入数组变量 */ publicfunctionassignArray($array) { if(is_array($array)) { foreach($arrayas$k=>$v){ $this->value[$k]=$v; } } } /** *获取模板的位置 *@return[type][description] */ publicfunctionpath() { return$this->arrayConfig['templateDir'].$this->file.$this->arrayConfig['suffix']; } /** *判断配置文件是否要求缓存 */ publicfunctionneedCache() { return$this->arrayConfig['cache_html']; } /** *判断是否需要缓存 */ publicfunctionreCache($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; } /** *展示模板 */ publicfunctionshow($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=newCompile($this->path(),$compileFile,$this->arrayConfig); if($this->needCache()) { ob_start(); } extract($this->value,EXTR_OVERWRITE); if(!is_file($compileFile)||fileatime($compileFile)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(); } publicfunctiondebug_info() { if($this->arrayConfig['debug']===true) { echo"
",'--------------------debug_info--------------',"
"; echo'程序运行日期:',date("Y-m-dh:i:s"),"
"; echo'模板解析耗时:',$this->debug['spend'],'秒',"
"; echo'模板包含标签数目:',$this->debug['count'],"
"; echo'是否使用静态缓存:',$this->debug['cached'],"
"; echo'模板引擎实例参数:',var_dump($this->getConfig()); } } /** *清楚缓存的html文件 *@return[type][description] */ publicfunctionclean() { 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)$pathas$v){ unlink($v); } } }
test.php
true)); $tpl->assign('data','helloworld'); $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程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。