<ol id="m9t9v"></ol>
    <ol id="m9t9v"><tbody id="m9t9v"></tbody></ol>
    <big id="m9t9v"><thead id="m9t9v"></thead></big>
    \n{include \"test.php\"}\n\n{#}這是一條PHP的注釋,在HTML頁(yè)面里是不顯示的,只會(huì)在生成的編譯文件里顯示{#}\n我將被index.php導(dǎo)入\n{$name}這個(gè)標(biāo)簽必須經(jīng)過(guò)Parser.class.php這個(gè)解析類來(lái)解析它1\n
    \n這里的內(nèi)容改變了,為什么?\n
    \n{if $a}\n顯示一號(hào)皮膚\n{else}\n顯示二號(hào)皮膚\n{\/if}\n
    \n{foreach $array(key,value)}\n{@key}....{@value}
    \n{\/foreach}\n<\/body>\n<\/html>\n<\/pre>\n\n

      <\/p>\n

    模板類:<\/p>\n\n

             \/\/Templates.class.php   \n\tclass Templates {\n\t    \/\/創(chuàng)建一個(gè)存放數(shù)組的字段\n\t    private $_vars = array();\n\t    private $_config = array();\n\t    \/\/創(chuàng)建一個(gè)構(gòu)造方法\n\t    public function __construct(){\n\t        if(!is_dir(TPL_DIR) || !is_dir(TPL_C_DIR) || !is_dir(CACHE_DIR) ){\n\t            exit('ERROR:模板文件夾或者編譯文件夾或者緩存文件夾沒有創(chuàng)建!');\n\t        }\n\t        \/\/獲取系統(tǒng)變量\n\t        $_sxe = simplexml_load_file(ROOT_PATH.'\/config\/profile.xml');\n\t        $_taglib = $_sxe->xpath('\/root\/taglib');\n\t        foreach($_taglib as $_tag){\n\t            $this->_config[\"$_tag->name\"] = $_tag->value;\n\t        }\n\t    }\n\t  \n\t    \n\t    \/\/創(chuàng)建變量注入方法\n\t    \/**\n\t     * assign()變量注入方法\n\t     * @param  $_var 要注入的變量名,對(duì)應(yīng).tpl文件中的需要替換的變量 \n\t     * @param  $_values 要注入的變量值\n\t     *\/\n\t    public function assign($_var,$_values){\n\t        if(isset($_var) && !empty($_var)){\n\t            $this->_vars[$_var] = $_values;\n\t            \n\t        }else{\n\t            exit('ERROR:請(qǐng)?jiān)O(shè)置變量名!');\n\t        }\n\t        \n\t    }\n\t    \n\t    \n\t    \/\/創(chuàng)建一個(gè)顯示方法,用來(lái)顯示編譯后的文件\n\t    public function display($_file){\n\t        \/\/設(shè)置模板文件的路徑\n\t        $_tplFile = TPL_DIR.$_file;\n\t        \/\/判斷模板文件是否存在\n\t        if(!file_exists($_tplFile)){\n\t            exit('ERROR:模板文件不存在');\n\t        }\n\t        \/\/設(shè)置編譯文件名\n\t        $_parFile  = TPL_C_DIR.md5($_file).$_file.'.php';\n\t        \/\/設(shè)置緩存文件名\n\t        $_cacheFile = CACHE_DIR.md5($_file).$_file.'.html';\n\t        \/\/判斷緩存狀態(tài)\n\t        if(IS_CACHE){\n\t            \/\/判斷緩存文件是否存在\n\t            if(file_exists($_cacheFile) && file_exists($_parFile)){\n\t                \/\/是否修改過(guò)編譯文件或者模板文件\n\t                if(filemtime($_cacheFile)>=filemtime($_parFile) && filemtime($_parFile)>filemtime($_tplFile)){\n\t                    echo '以下是緩存文件內(nèi)容';\n\t                    echo \"
    \";\n\t include $_cacheFile;\n\t return;\n\t }\n\t }\n\t }\n\t \/\/判斷編譯文件是否存在,模板文件是否修改過(guò)\n\t if(!file_exists($_parFile) || (filemtime($_parFile) < filemtime($_tplFile))){\n\t \n\t \/\/引入模板解析類\n\t require ROOT_PATH.'\/includes\/Parser.class.php';\n\t \/\/實(shí)例化對(duì)象,生成編譯文件\n\t $_parser = new Parser($_tplFile);\/\/模板文件\n\t $_parser->compile($_parFile);\/\/編譯后文件\n\t \n\t }\n\n\t \/\/載入編譯文件\n\t include $_parFile;\n\t if(IS_CACHE){\n \t \/\/生成緩存文件\n \t file_put_contents($_cacheFile, ob_get_contents());\n \t \/\/清除緩沖區(qū)\n \t ob_end_clean();\n \t \/\/載入緩存文件\n \t include $_cacheFile;\n\t }\n\n\n\t }\n\t}\n<\/pre>\n\n

    解析類:<\/p>\n\n

    \/\/Parser.class.php\n\tclass Parser {\n\t    \/\/獲取模板內(nèi)容\n\t    private $_tpl;\n\t    \/\/構(gòu)造方法,初始化模板\n\t    public function __construct($_tplFile){\n\t        \/\/判斷文件是否存在\n\t        if(!$this->_tpl = file_get_contents($_tplFile)){\n\t            exit('ERROR:讀取模板出錯(cuò)!');\n\t        }\n\t        \n\t    }\n\t    \n\t    \/\/解析普通變量\n\t    private function parVar(){\n    \t    $_pattern = '\/\\{\\$([\\w]+)\\}\/';\n    \t\tif (preg_match($_pattern,$this->_tpl)) {\n    \t\t\t$this->_tpl = preg_replace($_pattern,\"_vars['$1'] ?>\",$this->_tpl);\n    \t\t}\n\t    }\n\t    \/\/解析IF條件語(yǔ)句\n\t    private function parIf(){\n\t        \/\/開頭if模式\n\t        $_patternIf = '\/\\{if\\s+\\$([\\w]+)\\}\/';\n\t        \/\/結(jié)尾if模式\n\t        $_patternEnd = '\/\\{\\\/if\\}\/';\n\t        \/\/else模式\n\t        $_patternElse = '\/\\{else\\}\/';\n\t        \/\/判斷if是否存在\n\t        if(preg_match($_patternIf, $this->_tpl)){\n\t            \/\/判斷是否有if結(jié)尾\n\t            if(preg_match($_patternEnd, $this->_tpl)){\n\t                \/\/替換開頭IF\n\t                $this->_tpl = preg_replace($_patternIf, \"_vars['$1']){ ?>\", $this->_tpl);\n\t                \/\/替換結(jié)尾IF\n\t                $this->_tpl = preg_replace($_patternEnd, \"\", $this->_tpl);\n\t                \/\/判斷是否有else\n\t                if(preg_match($_patternElse, $this->_tpl)){\n\t                    \/\/替換else\n\t                    $this->_tpl = preg_replace($_patternElse, \"\", $this->_tpl);\n\t                }\n\t            }else{\n\t                exit('ERROR:語(yǔ)句沒有關(guān)閉!');\n\t            }\n\t        }\n\t    }\n\t    \/\/解析foreach\n\t    private function parForeach(){\n\t        $_patternForeach = '\/\\{foreach\\s+\\$(\\w+)\\((\\w+),(\\w+)\\)\\}\/';\n\t        $_patternEndForeach = '\/\\{\\\/foreach\\}\/';\n\t        \/\/foreach里的值\n\t        $_patternVar = '\/\\{@(\\w+)\\}\/';\n\t        \/\/判斷是否存在\n\t        if(preg_match($_patternForeach, $this->_tpl)){\n\t            \/\/判斷結(jié)束標(biāo)志\n\t            if(preg_match($_patternEndForeach, $this->_tpl)){\n\t                \/\/替換開頭\n\t                $this->_tpl = preg_replace($_patternForeach, \"_vars['$1'] as \\$$2=>\\$$3){?>\", $this->_tpl);\n\t                \/\/替換結(jié)束\n\t                $this->_tpl = preg_replace($_patternEndForeach, \"\", $this->_tpl);\n\t                \/\/替換值\n\t                $this->_tpl = preg_replace($_patternVar, \"\", $this->_tpl);\n\t            }else{\n\t                exit('ERROR:Foreach語(yǔ)句沒有關(guān)閉');\n\t            }\n\t        }\n\t    }\n\t    \/\/解析include\n\t    private function parInclude(){\n\t        $_pattern = '\/\\{include\\s+\\\"(.*)\\\"\\}\/';\n\t        if(preg_match($_pattern, $this->_tpl,$_file)){\n\t            \/\/判斷頭文件是否存在\n\t            if(!file_exists($_file[1]) || empty($_file[1])){\n\t                exit('ERROR:包含文件不存在!');\n\t            }\n                \/\/替換內(nèi)容\n                $this->_tpl = preg_replace($_pattern, \"\", $this->_tpl);\n\t        }\n\t    }\n\t    \/\/解析系統(tǒng)變量\n\t    private function configVar(){\n\t        $_pattern = '\/\/';\n\t        if(preg_match($_pattern, $this->_tpl,$_file)){\n \t            $this->_tpl = preg_replace($_pattern,\"_config['$1'] ?>\", $this->_tpl);\n                \n\t        }\n\t    }\n\t    \n\t    \/\/解析單行PHP注釋\n\t    private function parCommon(){\n\t        $_pattern = '\/\\{#\\}(.*)\\{#\\}\/';\n\t        if(preg_match($_pattern, $this->_tpl)){\n\t            $this->_tpl = preg_replace($_pattern, \"\", $this->_tpl);\n\t        }\n\t    }\n\t    \n\t    \n\t    \/\/生成編譯文件\n\t    public function compile($_parFile){\n\t        \/\/解析模板變量\n\t        $this->parVar();\n\t        \/\/解析IF\n\t        $this->parIf();\n\t        \/\/解析注釋\n\t        $this->parCommon();\n\t        \/\/解析Foreach\n\t        $this->parForeach();\n\t        \/\/解析include\n\t        $this->parInclude();\n\t        \/\/解析系統(tǒng)變量\n\t        $this->configVar();\n\t        \/\/生成編譯文件\n\t        if(!file_put_contents($_parFile, $this->_tpl)){\n\t            exit('ERROR:編譯文件生成失??!');\n\t        }\n\t    }\n\t}\n<\/pre>\n\n

      <\/p>\n

    總結(jié):模板引擎的整個(gè)過(guò)程:<\/p>\n

      1、當(dāng)瀏覽器請(qǐng)求index.php文件時(shí),實(shí)例化模板類對(duì)像?$_tpl = new Templates();<\/p>\n

      2、當(dāng)Templates實(shí)例化的時(shí)候,生成兩個(gè)數(shù)組,一個(gè)用來(lái)存放模板變量,另一個(gè)存放系統(tǒng)變量,通過(guò)構(gòu)造方法,判斷文件夾是否存在,同時(shí)通過(guò)XML文件將系統(tǒng)變量數(shù)組初始化<\/p>\n

      3、通過(guò)模板類Templates的注入方法,assign(),將對(duì)應(yīng)模板index.tpl中變量的index.php的內(nèi)容注入到模板類的私有變量,完成初始化<\/p>\n

      4、模板類Templates類顯示方法display() 通過(guò)實(shí)例化解析類Parser,將取到的注入變量通過(guò)解析類進(jìn)行解析(即替換)<\/p>\n

      5、解析(替換)后,將文件寫入PHP、HTML混全文件<\/p>\n

      6、通過(guò)Templates類的顯示方法將文件輸出:<\/p>\n

         1、第一次執(zhí)行顯示方法時(shí),將會(huì)把PHP、HTML混合文件,生成純靜態(tài)的緩存文件<\/p>\n

         2、調(diào)用緩存文件,顯示頁(yè)面<\/p>\n

      <\/span>  <\/span> 3、當(dāng)瀏覽器再次調(diào)用顯示方法時(shí),首先根據(jù)各文件的最后修改時(shí)間,判斷是否重新生成緩存文件或直接調(diào)用已存在的緩存文件<\/span><\/p>\n

    重點(diǎn):<\/span><\/p>\n

      1、通過(guò)正則表達(dá)式進(jìn)行字符串的替換<\/span><\/p>\n

      2、熟悉OOP<\/span><\/p>\n

      <\/p>\n

    ?<\/p>\n

    <\/p>\n

    \nhttp:\/\/www.bkjia.com\/PHPjc\/1055139.html<\/span>www.bkjia.com<\/span>true<\/span>http:\/\/www.bkjia.com\/PHPjc\/1055139.html<\/span>TechArticle<\/span>PHP--關(guān)于模板的原理和解析,php--模板解析 此內(nèi)容用作筆記,以備日后查看,此內(nèi)容為學(xué)習(xí)李炎恢課程而來(lái),并非自己所創(chuàng),如有問(wèn)題請(qǐng)...<\/span>\n<\/div>\n
    <\/div>\n"}

    国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

    目錄
    PHP--關(guān)于模板的原理和解析,php--模板解析
    首頁(yè) 后端開發(fā) php教程 PHP--關(guān)于模板的原理和解析,php--模板解析_PHP教程

    PHP--關(guān)于模板的原理和解析,php--模板解析_PHP教程

    Jul 12, 2016 am 09:08 AM
    模板引擎

    PHP--關(guān)于模板的原理和解析,php--模板解析

    此內(nèi)容用作筆記,以備日后查看,此內(nèi)容為學(xué)習(xí)李炎恢課程而來(lái),并非自己所創(chuàng),如有問(wèn)題請(qǐng)私信~

    將PHP代碼和靜態(tài)HTML代碼進(jìn)行分離,使代碼的可讀性和維護(hù)性得到顯著提高。

    使用模板引擎:

    ? ? 我們所說(shuō)的模板是Web模板,是主要由HTML標(biāo)記組成的語(yǔ)言來(lái)編寫的頁(yè)面,但也有如何表示包含動(dòng)態(tài)生成內(nèi)容的方式(解析標(biāo)簽)。模板引擎是一種軟件庫(kù),允許我們從模板生成HTML代碼,并指定要包含的動(dòng)態(tài)內(nèi)容。

      模板引擎的特點(diǎn):

      1.鼓勵(lì)分離:讓更個(gè)系統(tǒng)的可讀性和維護(hù)性得到提高。
      2.促進(jìn)分工:使得程序員和美工去專心處理自己的設(shè)計(jì)。
      3.比PHP更容易解析:編譯文件和緩存文件加載更快、占資源更少。
      4.增加安全性:可限制模板設(shè)計(jì)師進(jìn)行不安全的操作的能力避免誤刪誤訪問(wèn)等。

    模板處理的流程圖

      

    ?

    創(chuàng)建模板:

      1、創(chuàng)建初始模板所需要的文件夾和文件。

      a) index.php主文件,用于編寫業(yè)務(wù)邏輯。
      b) template.inc.php模板初始化文件,用于初始模版信息。
      c) templates目錄存放所有的模板文件。
      d) templates_c目錄存放所有編譯文件。
      e) cache目錄存放所有緩存文件。
      f) includes目錄存放所有的類文件。
      g) config目錄存放模板系統(tǒng)變量配置文件。

      

      以下是源碼:

    主文件 index.php  

    <?<span>php
       //index.php</span>

      //設(shè)置編碼為UTF-8
      header('Content-Type:text/html;Charset=utf-8');
      //網(wǎng)站根目錄
      define('ROOT_PATH', dirname(__FILE__));
      //存放模板文件夾
      define('TPL_DIR', ROOT_PATH.'/templates/');
      //編譯文件夾
      define('TPL_C_DIR', ROOT_PATH.'/templates_c/');
      //緩存文件夾
      define('CACHE_DIR', ROOT_PATH.'/cache/');
      //定義緩存狀態(tài)
      define('IS_CACHE',true);
      //設(shè)置緩存狀態(tài)開關(guān)
      IS_CACHE ? ob_start() : null;

      include ROOT_PATH.'/includes/Templates.class.php';

    <span>  </span><span>$_name</span> = '方塊李'<span>;
        
        </span><span>$array</span> = <span>array</span>(1,2,3,4,5,6<span>);
        </span><span>$_tpl</span> = <span>new</span><span> Templates();
        </span><span>$_tpl</span>->assign('name', <span>$_name</span><span>);
        </span><span>$_tpl</span>->assign('a', 5>4<span>);
        </span><span>$_tpl</span>->assign('array', <span>$array</span><span>);
        </span><span>//</span><span>顯示</span>
        <span>$_tpl</span>->display('index.tpl'<span>);
    </span>?>

    模板文件 HTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title><!--{webname}--></title>
    
    </head>
    <body>
    {include "test.php"}
    <!-- 這是HTML的注釋 -->
    {#}這是一條PHP的注釋,在HTML頁(yè)面里是不顯示的,只會(huì)在生成的編譯文件里顯示{#}
    我將被index.php導(dǎo)入
    {$name}這個(gè)標(biāo)簽必須經(jīng)過(guò)Parser.class.php這個(gè)解析類來(lái)解析它1
    <br />
    這里的內(nèi)容改變了,為什么?
    <br />
    {if $a}
    顯示一號(hào)皮膚
    {else}
    顯示二號(hào)皮膚
    {/if}
    <br />
    {foreach $array(key,value)}
    {@key}....{@value} <br />
    {/foreach}
    </body>
    </html>
    

      

    模板類:

             //Templates.class.php   
    	class Templates {
    	    //創(chuàng)建一個(gè)存放數(shù)組的字段
    	    private $_vars = array();
    	    private $_config = array();
    	    //創(chuàng)建一個(gè)構(gòu)造方法
    	    public function __construct(){
    	        if(!is_dir(TPL_DIR) || !is_dir(TPL_C_DIR) || !is_dir(CACHE_DIR) ){
    	            exit('ERROR:模板文件夾或者編譯文件夾或者緩存文件夾沒有創(chuàng)建!');
    	        }
    	        //獲取系統(tǒng)變量
    	        $_sxe = simplexml_load_file(ROOT_PATH.'/config/profile.xml');
    	        $_taglib = $_sxe->xpath('/root/taglib');
    	        foreach($_taglib as $_tag){
    	            $this->_config["$_tag->name"] = $_tag->value;
    	        }
    	    }
    	  
    	    
    	    //創(chuàng)建變量注入方法
    	    /**
    	     * assign()變量注入方法
    	     * @param  $_var 要注入的變量名,對(duì)應(yīng).tpl文件中的需要替換的變量 
    	     * @param  $_values 要注入的變量值
    	     */
    	    public function assign($_var,$_values){
    	        if(isset($_var) && !empty($_var)){
    	            $this->_vars[$_var] = $_values;
    	            
    	        }else{
    	            exit('ERROR:請(qǐng)?jiān)O(shè)置變量名!');
    	        }
    	        
    	    }
    	    
    	    
    	    //創(chuàng)建一個(gè)顯示方法,用來(lái)顯示編譯后的文件
    	    public function display($_file){
    	        //設(shè)置模板文件的路徑
    	        $_tplFile = TPL_DIR.$_file;
    	        //判斷模板文件是否存在
    	        if(!file_exists($_tplFile)){
    	            exit('ERROR:模板文件不存在');
    	        }
    	        //設(shè)置編譯文件名
    	        $_parFile  = TPL_C_DIR.md5($_file).$_file.'.php';
    	        //設(shè)置緩存文件名
    	        $_cacheFile = CACHE_DIR.md5($_file).$_file.'.html';
    	        //判斷緩存狀態(tài)
    	        if(IS_CACHE){
    	            //判斷緩存文件是否存在
    	            if(file_exists($_cacheFile) && file_exists($_parFile)){
    	                //是否修改過(guò)編譯文件或者模板文件
    	                if(filemtime($_cacheFile)>=filemtime($_parFile) && filemtime($_parFile)>filemtime($_tplFile)){
    	                    echo '以下是緩存文件內(nèi)容';
    	                    echo "<br />";
    	                    include $_cacheFile;
    	                    return;
    	                }
    	            }
    	        }
    	        //判斷編譯文件是否存在,模板文件是否修改過(guò)
    	        if(!file_exists($_parFile) || (filemtime($_parFile) < filemtime($_tplFile))){
    	            
    	            //引入模板解析類
    	            require ROOT_PATH.'/includes/Parser.class.php';
    	            //實(shí)例化對(duì)象,生成編譯文件
    	            $_parser = new Parser($_tplFile);//模板文件
    	            $_parser->compile($_parFile);//編譯后文件
    	            
    	        }
    
    	        //載入編譯文件
    	        include $_parFile;
    	        if(IS_CACHE){
        	        //生成緩存文件
        	        file_put_contents($_cacheFile, ob_get_contents());
        	        //清除緩沖區(qū)
        	        ob_end_clean();
        	        //載入緩存文件
        	        include $_cacheFile;
    	        }
    
    
    	    }
    	}
    

    解析類:

    //Parser.class.php
    	class Parser {
    	    //獲取模板內(nèi)容
    	    private $_tpl;
    	    //構(gòu)造方法,初始化模板
    	    public function __construct($_tplFile){
    	        //判斷文件是否存在
    	        if(!$this->_tpl = file_get_contents($_tplFile)){
    	            exit('ERROR:讀取模板出錯(cuò)!');
    	        }
    	        
    	    }
    	    
    	    //解析普通變量
    	    private function parVar(){
        	    $_pattern = '/\{\$([\w]+)\}/';
        		if (preg_match($_pattern,$this->_tpl)) {
        			$this->_tpl = preg_replace($_pattern,"<?php echo \$this->_vars['$1'] ?>",$this->_tpl);
        		}
    	    }
    	    //解析IF條件語(yǔ)句
    	    private function parIf(){
    	        //開頭if模式
    	        $_patternIf = '/\{if\s+\$([\w]+)\}/';
    	        //結(jié)尾if模式
    	        $_patternEnd = '/\{\/if\}/';
    	        //else模式
    	        $_patternElse = '/\{else\}/';
    	        //判斷if是否存在
    	        if(preg_match($_patternIf, $this->_tpl)){
    	            //判斷是否有if結(jié)尾
    	            if(preg_match($_patternEnd, $this->_tpl)){
    	                //替換開頭IF
    	                $this->_tpl = preg_replace($_patternIf, "<?php if(\$this->_vars['$1']){ ?>", $this->_tpl);
    	                //替換結(jié)尾IF
    	                $this->_tpl = preg_replace($_patternEnd, "<?php } ?>", $this->_tpl);
    	                //判斷是否有else
    	                if(preg_match($_patternElse, $this->_tpl)){
    	                    //替換else
    	                    $this->_tpl = preg_replace($_patternElse, "<?php }else{ ?>", $this->_tpl);
    	                }
    	            }else{
    	                exit('ERROR:語(yǔ)句沒有關(guān)閉!');
    	            }
    	        }
    	    }
    	    //解析foreach
    	    private function parForeach(){
    	        $_patternForeach = '/\{foreach\s+\$(\w+)\((\w+),(\w+)\)\}/';
    	        $_patternEndForeach = '/\{\/foreach\}/';
    	        //foreach里的值
    	        $_patternVar = '/\{@(\w+)\}/';
    	        //判斷是否存在
    	        if(preg_match($_patternForeach, $this->_tpl)){
    	            //判斷結(jié)束標(biāo)志
    	            if(preg_match($_patternEndForeach, $this->_tpl)){
    	                //替換開頭
    	                $this->_tpl = preg_replace($_patternForeach, "<?php foreach(\$this->_vars['$1'] as \$$2=>\$$3){?>", $this->_tpl);
    	                //替換結(jié)束
    	                $this->_tpl = preg_replace($_patternEndForeach, "<?php } ?>", $this->_tpl);
    	                //替換值
    	                $this->_tpl = preg_replace($_patternVar, "<?php echo \$$1?>", $this->_tpl);
    	            }else{
    	                exit('ERROR:Foreach語(yǔ)句沒有關(guān)閉');
    	            }
    	        }
    	    }
    	    //解析include
    	    private function parInclude(){
    	        $_pattern = '/\{include\s+\"(.*)\"\}/';
    	        if(preg_match($_pattern, $this->_tpl,$_file)){
    	            //判斷頭文件是否存在
    	            if(!file_exists($_file[1]) || empty($_file[1])){
    	                exit('ERROR:包含文件不存在!');
    	            }
                    //替換內(nèi)容
                    $this->_tpl = preg_replace($_pattern, "<?php include '$1';?>", $this->_tpl);
    	        }
    	    }
    	    //解析系統(tǒng)變量
    	    private function configVar(){
    	        $_pattern = '/<!--\{(\w+)\}-->/';
    	        if(preg_match($_pattern, $this->_tpl,$_file)){
     	            $this->_tpl = preg_replace($_pattern,"<?php echo \$this->_config['$1'] ?>", $this->_tpl);
                    
    	        }
    	    }
    	    
    	    //解析單行PHP注釋
    	    private function parCommon(){
    	        $_pattern = '/\{#\}(.*)\{#\}/';
    	        if(preg_match($_pattern, $this->_tpl)){
    	            $this->_tpl = preg_replace($_pattern, "<?php /*($1) */?>", $this->_tpl);
    	        }
    	    }
    	    
    	    
    	    //生成編譯文件
    	    public function compile($_parFile){
    	        //解析模板變量
    	        $this->parVar();
    	        //解析IF
    	        $this->parIf();
    	        //解析注釋
    	        $this->parCommon();
    	        //解析Foreach
    	        $this->parForeach();
    	        //解析include
    	        $this->parInclude();
    	        //解析系統(tǒng)變量
    	        $this->configVar();
    	        //生成編譯文件
    	        if(!file_put_contents($_parFile, $this->_tpl)){
    	            exit('ERROR:編譯文件生成失?。?);
    	        }
    	    }
    	}
    

      

    總結(jié):模板引擎的整個(gè)過(guò)程:

      1、當(dāng)瀏覽器請(qǐng)求index.php文件時(shí),實(shí)例化模板類對(duì)像?$_tpl = new Templates();

      2、當(dāng)Templates實(shí)例化的時(shí)候,生成兩個(gè)數(shù)組,一個(gè)用來(lái)存放模板變量,另一個(gè)存放系統(tǒng)變量,通過(guò)構(gòu)造方法,判斷文件夾是否存在,同時(shí)通過(guò)XML文件將系統(tǒng)變量數(shù)組初始化

      3、通過(guò)模板類Templates的注入方法,assign(),將對(duì)應(yīng)模板index.tpl中變量的index.php的內(nèi)容注入到模板類的私有變量,完成初始化

      4、模板類Templates類顯示方法display() 通過(guò)實(shí)例化解析類Parser,將取到的注入變量通過(guò)解析類進(jìn)行解析(即替換)

      5、解析(替換)后,將文件寫入PHP、HTML混全文件

      6、通過(guò)Templates類的顯示方法將文件輸出:

         1、第一次執(zhí)行顯示方法時(shí),將會(huì)把PHP、HTML混合文件,生成純靜態(tài)的緩存文件

         2、調(diào)用緩存文件,顯示頁(yè)面

         3、當(dāng)瀏覽器再次調(diào)用顯示方法時(shí),首先根據(jù)各文件的最后修改時(shí)間,判斷是否重新生成緩存文件或直接調(diào)用已存在的緩存文件

    重點(diǎn):

      1、通過(guò)正則表達(dá)式進(jìn)行字符串的替換

      2、熟悉OOP

      

    ?

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1055139.htmlTechArticlePHP--關(guān)于模板的原理和解析,php--模板解析 此內(nèi)容用作筆記,以備日后查看,此內(nèi)容為學(xué)習(xí)李炎恢課程而來(lái),并非自己所創(chuàng),如有問(wèn)題請(qǐng)...
    本站聲明
    本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

    熱AI工具

    Undress AI Tool

    Undress AI Tool

    免費(fèi)脫衣服圖片

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用于從照片中去除衣服的在線人工智能工具。

    Clothoff.io

    Clothoff.io

    AI脫衣機(jī)

    Video Face Swap

    Video Face Swap

    使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費(fèi)的代碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    功能強(qiáng)大的PHP集成開發(fā)環(huán)境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網(wǎng)頁(yè)開發(fā)工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級(jí)代碼編輯軟件(SublimeText3)

    ThinkPHP6模板引擎使用指南:打造精美的前端界面 ThinkPHP6模板引擎使用指南:打造精美的前端界面 Aug 26, 2023 pm 11:09 PM

    ThinkPHP6模板引擎使用指南:打造精美的前端界面引言:隨著Web應(yīng)用程序的發(fā)展,前端界面的設(shè)計(jì)和開發(fā)變得愈發(fā)重要。作為一個(gè)開發(fā)人員,我們需要使用一個(gè)強(qiáng)大的模板引擎來(lái)幫助我們創(chuàng)建和管理前端界面。ThinkPHP6的模板引擎正是滿足這一需求的強(qiáng)大工具。本文將介紹如何使用ThinkPHP6模板引擎來(lái)打造精美的前端界面。第一部分:安裝ThinkPHP6模板引擎

    PHP編程中有哪些常見的模板引擎? PHP編程中有哪些常見的模板引擎? Jun 12, 2023 am 09:50 AM

    最近幾年,PHP編程中的模板引擎已經(jīng)成為了PHP開發(fā)的重要組成部分,方便了程序員進(jìn)行頁(yè)面開發(fā)和管理。本文將介紹PHP編程中常見的模板引擎。SmartySmarty是一個(gè)比較常用的PHP模板引擎,它支持緩存模板、插件模塊和自定義函數(shù)等一系列功能。Smarty的語(yǔ)法十分靈活,能夠解決PHP變量與HTML標(biāo)記的結(jié)合難題,使得PHP語(yǔ)言更適用于模板化的設(shè)計(jì)。而且,S

    JavaScript開發(fā)中的模板引擎選擇與使用經(jīng)驗(yàn)分享 JavaScript開發(fā)中的模板引擎選擇與使用經(jīng)驗(yàn)分享 Nov 04, 2023 am 11:42 AM

    JavaScript開發(fā)中的模板引擎選擇與使用經(jīng)驗(yàn)分享引言:在現(xiàn)代前端開發(fā)中,模板引擎(TemplateEngine)扮演著至關(guān)重要的角色。它們能夠使開發(fā)者更加高效地組織和管理大量的動(dòng)態(tài)數(shù)據(jù),并有效地將數(shù)據(jù)與界面展示分離開來(lái)。同時(shí),選擇合適的模板引擎也能夠?yàn)殚_發(fā)者帶來(lái)更好的開發(fā)體驗(yàn)和性能優(yōu)化。然而,在眾多的JavaScript模板引擎中,該選擇哪一個(gè)呢?接

    如何在Fat-Free框架中使用模板引擎Blade? 如何在Fat-Free框架中使用模板引擎Blade? Jun 03, 2023 pm 08:40 PM

    Fat-Free框架是一個(gè)輕量級(jí)的PHP框架,旨在提供簡(jiǎn)單而靈活的工具來(lái)構(gòu)建Web應(yīng)用程序。它包含許多有用的功能,例如路由、數(shù)據(jù)庫(kù)訪問(wèn)、緩存等。在Fat-Free框架中,使用Blade模板引擎可以幫助我們更方便地管理和渲染模板。Blade是Laravel框架中的模板引擎,它提供了強(qiáng)大的語(yǔ)法和模板繼承功能。在本文中,我將演示如何在Fat-Free框架中使用Bl

    學(xué)習(xí)使用Golang模板引擎:在Golang中使用模板的基礎(chǔ)指南 學(xué)習(xí)使用Golang模板引擎:在Golang中使用模板的基礎(chǔ)指南 Jan 20, 2024 am 10:13 AM

    Golang模板引擎入門指南:如何在Golang中使用模板,需要具體代碼示例簡(jiǎn)介:模板引擎是一種能將數(shù)據(jù)和模板進(jìn)行組合并生成HTML、文本或其他格式文檔的工具。在Golang中,我們可以使用內(nèi)置的模板包(html/template)來(lái)實(shí)現(xiàn)模板引擎的功能。本文將詳細(xì)介紹如何在Golang中使用模板引擎,并提供具體的代碼示例。一、模板引擎的基本概念在了解如何使用

    PHP和CGI的模板引擎:如何實(shí)現(xiàn)網(wǎng)站的可重用性 PHP和CGI的模板引擎:如何實(shí)現(xiàn)網(wǎng)站的可重用性 Jul 20, 2023 pm 10:13 PM

    PHP和CGI的模板引擎:如何實(shí)現(xiàn)網(wǎng)站的可重用性引言:在開發(fā)網(wǎng)站時(shí),我們經(jīng)常需要處理動(dòng)態(tài)內(nèi)容的顯示。為了實(shí)現(xiàn)代碼的可維護(hù)性和可重用性,使用模板引擎是一個(gè)明智的選擇。本文將介紹PHP和CGI兩種常用的模板引擎,并通過(guò)代碼示例展示如何使用它們來(lái)實(shí)現(xiàn)網(wǎng)站的可重用性。一、PHP模板引擎PHP是一種廣泛使用的服務(wù)器腳本語(yǔ)言,它具有靈活性和強(qiáng)大的功能。PHP模板引擎是一

    Go語(yǔ)言中的模板引擎:完整指南 Go語(yǔ)言中的模板引擎:完整指南 Jun 17, 2023 pm 12:55 PM

    隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,Web應(yīng)用程序的需求也不斷增加。Web開發(fā)人員通常使用模板引擎來(lái)生成動(dòng)態(tài)網(wǎng)頁(yè)。這篇文章將探討一種新的模板引擎:Go語(yǔ)言模板引擎。什么是Go語(yǔ)言模板引擎?Go語(yǔ)言是由Google公司開發(fā)的一種先進(jìn)的編程語(yǔ)言。它的語(yǔ)法簡(jiǎn)潔明了,易于學(xué)習(xí)和使用。Go語(yǔ)言模板引擎是Go語(yǔ)言中用于生成HTML模板的一種模板系統(tǒng)。Go語(yǔ)言模板引擎被稱為"標(biāo)準(zhǔn)庫(kù)",

    PHP開發(fā)中如何使用Smarty模板引擎 PHP開發(fā)中如何使用Smarty模板引擎 Jun 27, 2023 pm 01:28 PM

    作為一名PHP開發(fā)者,使用模板引擎是理所當(dāng)然的選擇。Smarty是一種流行的模板引擎,它提供了一種將HTML/CSS/JavaScript與PHP代碼分離的方式,使開發(fā)人員能夠更好地組織和管理項(xiàng)目。在本文中,我們將學(xué)習(xí)在PHP開發(fā)過(guò)程中如何使用Smarty模板引擎。一、安裝Smarty在之前,我們必須安裝Smarty。在本文中,我們將使用Composer安裝

    See all articles