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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。