Heim > Backend-Entwicklung > PHP-Tutorial > 代码解释类似smart模版引擎原理

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

WBOY
Freigeben: 2016-07-29 09:05:00
Original
1005 Leute haben es durchsucht

先贴下目录结构:

<code> ls
compiled/  index.php  source/  ss.class.PHP

compiled 模版编辑后的目录
index.php
source 模版源文件夹
ss.clsss.php 山寨类smarty文件夹
</code>
Nach dem Login kopieren
<code>ss.clsss.php
</code>
Nach dem Login kopieren
<code><?php class Template{

        private $templateDir;//源文件文件夹
        private $compileDir;//编译之后文件夹
        private $leftTag="{#";//需要替换的左边标记
        private $rightTag="#}";//需要替换的左边标记
        private $templateExtName=".html";
        private $currentTemp;//当前正在编译的模版文件名
        private $outputHtml;//正在读取的模版文件
        private $varPool=array();//模版变量池

        public function__construct($templateDir,$compileDir,$leftTag=null,$rightTag=null,$templateExtName=null){

            $this->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);

            //前后加上空格匹配任意次匹配类似<h1>{# $name  #}</h1>
            $pattern.=' *\$([a-zA-Z_]\w*) *';

            $pattern.=preg_quote($this->rightTag)."/";

            $this->outputHtml=preg_replace($pattern, '<?php echo $this->getVar(\'$1\');?>', $this->outputHtml);// $1写成\\1也可以 

            // 注意不要用双引号,会解析getvar Template::$getVar报notice错误
            $this->outputHtml=preg_replace($pattern, "<?php echo $this->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);

        }

    }</code>
Nach dem Login kopieren

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

<code><?php include('ss.class.php');

    $basedir=str_replace('\\', '/', dirname(__FILE__));//兼容linux等区分大小写平台

    $test=new Template($basedir."/source/",$basedir."/compiled/");

    $test->assign('name','iamtb');

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

    $test->getSourceTemplate('index');

    $test->compileTemplate('index');

    $test->display('index');
</code>
Nach dem Login kopieren

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage