学习笔记-模板引擎类

本小妞迷上赌 提交于 2020-01-07 15:59:03

【推荐】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');
 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!