欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

代码解释类似smart模版引擎原理

程序员文章站 2022-05-06 11:58:06
...
先贴下目录结构:
 ls
compiled/  index.php  source/  ss.class.PHP

compiled 模版编辑后的目录
index.php
source 模版源文件夹
ss.clsss.php 山寨类smarty文件夹
ss.clsss.php
templateDir=$templateDir;
            $this->compileDir=$compileDir;

            if(!empty($leftTag))$this->leftTag=$leftTag;
            if(!empty($rightTag))$this->rightTag=$rightTag;
            if(!empty($templateExtName))$this->templateExtName=$templateExtName;
        }

        // 把用到的变量放入到变量池子中
        public function assign($tag,$var){
            $this->varPool[$tag]=$var;
        }

        // 取出一条变量,用于下面的str_replace正则替换
        public function getVar($tag){
            return $this->varPool[$tag];
        }

        //获取模版源文件
        public function getSourceTemplate($templateName){

            $this->currentTemp=$templateName;

            // 拼接完整文件名
            $sourceFileName=$this->templateDir.$this->currentTemp.$this->templateExtName;
            $this->outputHtml=file_get_contents($sourceFileName);
        }

        // 编译
        public function compileTemplate($templateName=null){

            // 获取当前需要编译的模版
            $templateName=empty($templateName)?$this->currentTemp:$templateName;

            // $pattern='/\{#(\$[a-zA-Z_]\w+)#\}/';// 符合php变量命名

            //preg_quote 可对用户界定的左右定界符中出现. \ + * ? [ ^ ] $ ( ) { } = !  | : -进行转义
            $pattern="/".preg_quote($this->leftTag);

            //前后加上空格匹配任意次匹配类似

{# $name #}

$pattern.=' *\$([a-zA-Z_]\w*) *'; $pattern.=preg_quote($this->rightTag)."/"; $this->outputHtml=preg_replace($pattern, 'getVar(\'$1\');?>', $this->outputHtml);// $1写成\\1也可以 // 注意不要用双引号,会解析getvar Template::$getVar报notice错误 $this->outputHtml=preg_replace($pattern, "getVar(\\1);?>", $this->outputHtml); $compileFileName=$this->compileDir.md5($templateName).$this->templateExtName; file_put_contents($compileFileName, $this->outputHtml); } // 输出 public function display($templateName=null){ $templateName=empty($templateName)?$this->currentTemp:$templateName; include($this->compileDir.md5($templateName).$this->templateExtName); } }

简单调用如下:(index.php中内容)

assign('name','iamtb');

    $test->assign('pageTitle','tbtbt');

    $test->getSourceTemplate('index');

    $test->compileTemplate('index');

    $test->display('index');

以上就介绍了代码解释类似smart模版引擎原理,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。