【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
<?php
class TPL{
protected $viewDir='./view/';
protected $cacheDir='./cache/';
protected $lifeTime=3600;
protected $vars=[];
public function __construct($viewDir=null,$cahceDir=null,$lifeTime=null){
if(!empty($viewDir)){
$this->checkDir($viewDir);//检测路径
$this->viewDir=$viewDir;
}
if(!empty($cahceDir)){
$this->checkDir($cahceDir);//检测路径
$this->cahceDir=$cacheDir;
}
if(!empty($lifeTime)){
$this->lifeTime=$lifeTime;
}
}
protected function checkDir($filePath){//检测路径
if(!(file_exists($filePath) && is_dir($filePath) )){
mkdir($filePath);
}
if(!(is_readable($filePath) && is_writable($filePath) )){
chmod($filePath, 755);
}
}
public function assign($name,$value){//赋值
$this->vars[$name]=$value;
}
public function display($viewName,$isInclude=true,$uri=null){//展示文件
$viewPath=rtrim($this->viewDir,'/').'/'.$viewName;//模板路径
if(!file_exists($viewPath)){
die('模板不存在');
}
$caheName=md5($viewName.$uri).'.php';//缓存文件名
$cachePath=rtrim($this->cacheDir,'/').'/'.$caheName;//缓存路径
if(!file_exists($cachePath)){//判断是否已经生成缓存文件,否,则生成缓存文件
$php=$this->compile($viewPath);//编译模板文件
file_put_contents($cachePath, $php);//生成缓存文件
}
else{//是,判断是否过期、被修改过
$isTimeOut=(filectime($cachePath)+$this->lifeTime>time())?true:false;//判断是否过期
$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);//展示缓存文件
}
}
protected function compile($filePath){
$html=file_get_contents($filePath);//获取文件内容
//正则替换
$array=[
'{$%%}'=>'<?=$\1; ?>',
'{foreach %%}'=>'<?php foreach (\1): ?>',
'{/foreach}'=>'<?php endforeach?>',
'{include %%}'=>'',
'{if %%}'=>'<?php if (\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){
//将文件名两边的引号去掉
$fileName=rtrim($data[1],'\'"');
//然后不包含文件生成缓存
$this->display($fileName,false);
//拼接缓存文件全路径
$cacheName=md5($fileName).'.php';
$cachePath=rtrim($this->cacheDir,'/').'/'.$cacheName;
return '<?php include "'.$cachePath.'"?>';
}
}
测试文件html:
<?php
include 'TPL.php';
$tpl=new TPL();
$title='测试';
$data=['测试内容111','测试内容222'];
$inc='include文件';
$tpl->assign('title',$title);
$tpl->assign('data',$data);
$tpl->assign('inc',$inc);
$tpl->display('test.html');
来源:oschina
链接:https://my.oschina.net/lixiaoting/blog/3154415