<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                我們將對比使用smarty模板引擎和沒使用smarty模板引擎的兩種開發方式的區別,并動手開發一個自己的模板引擎,以便加深對smarty模板引擎工作機制的理解。 在沒有使用Smarty模板引擎的情況下,我們都是將PHP程序和網頁模板合在一起編輯的,好比下面的源代碼: ~~~ <?php$title="深處淺出之Smarty模板引擎工作機制";$content="Smarty模板引擎原理流程圖";$auth="MarcoFly";$website="www.MarcoFly.com";?><!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><?php echo $title?></title></head><body><p>內容:<?php echo $content?></p><p>作者:<?php echo $auth?></p><p>網址:<?php echo $website?></p></body></html> ~~~ 輸出到瀏覽器的結果截圖: ![](http://pic002.cnblogs.com/images/2011/350329/2011121022394428.jpg) 查看HTML源代碼: ~~~ <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>深處淺出之Smarty模板引擎工作機制</title></head><body><p>內容:Smarty模板引擎原理流程圖</p><p>作者:MarcoFly</p><p>網址:www.MarcoFly.com</p></body></html> ~~~ 程序比較小的情況下這種開發方式尚且不方便,一旦要開發一個大的WEB項目,就必須得使用到模板引擎。 ~~~ 使用模板引擎的情況下: ~~~ ~~~ 我們的開發方式將有所改變,美工人員只管做模板,后臺開發人員專心寫自己的程序。 ~~~ ~~~ 一個web項目就可以分為模板文件和PHP程序了 ~~~ ~~~ 比如: ~~~ ~~~ 美工人員就可以這樣編輯網頁模板文件: ~~~ ~~~ index.dwt源代碼 ~~~ ~~~ <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><{$title}></title></head><body><p>內容:<{$content}></p><p>作者:<{$auth}></p><p>網址:<{$website}></p></body></html> ~~~ ~~~ 而后臺WEB開發人員可以專注于PHP代碼的書寫: ~~~ ~~~ index.php ~~~ ~~~ <?php include "./Smarty.ini.php"; $title="深處淺出之Smarty模板引擎工作機制"; ~~~ ~~~ $content="Smarty模板引擎工作機制流程圖"; $auth="MarcoFly"; $website="www.MarcoFly.com"; $tpl->assign("title",$title); $tpl->assign("content",$content); $tpl->assign("auth",$auth); $tpl->assign("website",$website); $tpl->display("index.dwt");?> ~~~ ~~~ 從以上兩段簡單的演示代碼可以看出,前臺模板文件沒有涉及到任何關于PHP的代碼,只有幾個看似陌生的標簽<{$title}>和<{$content}>,而后臺的php程序代碼也沒有涉及到前臺的HMTL代碼 ~~~ ~~~       參考下圖對比這兩種開發方式的區別 ~~~ ![](http://pic002.cnblogs.com/images/2011/350329/2011121018464280.gif) ~~~ 通過對比,我們得出結論:在使用模板引擎后,原先需要使用PHP編寫的地方,現在只需要用模板引擎提供標簽的形式來代替了。 ~~~ ~~~ 注:Smarty模板引擎默認的標簽形式是{$xxx},如,{$title},{$content} ~~~ ~~~ 當然我們可以初始化為自己想要的標簽形式,如我將其初始化為:<{$xxx}>的形式),如,<{$title}>、<{$content}> ~~~ ~~~ 不知各位看官有木有覺得奇怪,<{$title}>、<{$content}>根本就不是PHP的語法形式,那最終又是如何被輸出到客戶的瀏覽器中的,是否另有玄機?帶著這個疑問,我們繼續深究...... ~~~ ~~~   其實,這一切的一切都是由Smarty模板引擎這雙神秘的手在“暗中操作”著,經過Smarty模板引擎的“暗中操作”之后,起初的模板文件(index.dwt)經過Smarty“成功手術”之后,被改造為能在服務器端執行的PHP代碼文件。 ~~~ ~~~ 想看看模板文件(index.dwt)和后臺的PHP程序(index.php)經過“手術”(即編譯)之后的廬山真面目嗎? ~~~ ~~~ 在此貼上經過模板引擎編譯之后的編譯文件的源代碼: ~~~ ~~~ <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><?php echo $this->arr["title"] ?></title></head><body><p>內容:<?php echo $this->arr["content"] ?></p><p>作者:<?php echo $this->arr["auth"] ?></p><p>網址:<?php echo $this->arr["website"] ?></p></body></html> ~~~ ~~~ 看到這里,各位看官是否恍然大悟,原來Smarty模板引擎的工作就是:將前臺美工人員編寫的模板文件(index.dwt)和后臺開發人員編寫的PHP程序(index.php)整合在一起,經過編譯這一步驟之后,原先的模板標簽被替換成了php代碼。 ~~~ ~~~ 為了方便大家理解,我簡單的做了一張代碼流程圖: ~~~ ![](http://pic002.cnblogs.com/images/2011/350329/2011121021571753.gif) ~~~ 接下來根據以下的Smarty模板引擎原理流程圖開發一個自己的模板引擎用于學習,以便加深理解。 ~~~ ![](http://pic002.cnblogs.com/images/2011/350329/2011121021105620.gif)   Smarty模板引擎的原理,其實是這么一個過程:   把模板文件編譯成php文件,然后每次都去讀取下模板的修改時間,沒有修改就不編譯。然后include這個“編譯”后的PHP文件。   所謂編譯也就是模板用正則替換成含PHP代碼的過程。   實際上并不會每次請求都編譯,所以性能尚可。   ?模板文件和php程序文件經過模板引擎的編譯后合成為一個文件,即編譯后的文件。 接下來,我們根據該原理流程寫一個簡單的模板引擎。。。。。。 **  先貼上核心代碼:** **  Smarty.class.php文件** ~~~ <?php class Smarty{ public $template_dir;//模板目錄 public $compile_dir;//編譯目錄 public $arr=array();//定義一個數組,用以存放assign中的第二個參數傳過來的值 public function __construct($template_dir="../templates",$compile_dir="../templates_c"){ $this->template_dir=$template_dir;//模板目錄 $this->compile_dir=$compile_dir; //編譯目錄 } public function assign($content,$replacment=null){ if($content!=""){ //如果指定模板變量,才將要賦的值存儲到數組中 $this->arr[$content]=$replacment; } } public function display($page){ $tplFile=$this->template_dir."/".$page;//讀取模板文件,注意:如果模板目錄下還有子目錄,記得要寫完整,比如,$smarty->display('Default/index.tpl') if(!file_exists($tplFile)){ return; } $comFile=$this->compile_dir."/"."com_".$page.".php"; $tplContent=$this->con_replace(file_get_contents($tplFile));//將smarty標簽替換為php的標簽 file_put_contents($comFile,$tplContent); include $comFile; } public function con_replace($content){ $pattern=array( '/<{\s*\$([a-zA-Z_][a-zA-Z_0-9]*)\s*}>/i' ); $replacement=array( '<?php echo $this->arr["${1}"] ?>' ); return preg_replace($pattern,$replacement,$content); } }?> ~~~ **Smarty.class.php****代碼解釋:** * $template_dir? 指定模板文件的目錄 * $compile_dir?? 指定編譯后的模板文件的目錄 * 構造函數?     public function __construct($template_dir="../templates",$compile_dir="../templates_c")     {??????????????????   ??????   $this->template_dir=$template_dir; ??????     $this->compile_dir=$compile_dir;     }     默認情況下,Smarty模板引擎將把templates目錄用于存放模板文件,templates_c用于存放編譯后的文件 ?    那為何要$replacement的值保存到數組中呢?     ?其實內部操作是這么一個流程:將**$replacement值保存到數組--->讀取模板文件(index.dwt,由display函數完成)--->將數組中的值匹配給模板文件中的變量(由con_replace()函數完成)--->將替換后的模板文件寫入到編譯文件中(com_index.dwt.php)--->輸出編譯后的PHP文件** * dispaly($page)函數接收一個參數,即要輸出的模板文件(index.dwt) * 首先,將模板文件的路徑賦給$tplFile($tplFile=$this->template_dir."/".$page)   * 判斷模板文件是否存在,如果不存在,就沒必要加載了,直接return * 指定一個編譯文件,以便存放替換變量后的模板文件 * 通過函數file_get_contents()讀取模板文件,并通過函數conf_replace()替換掉模板中的smarty標簽 * 將替換變量后的模板文件通過file_put_contents()寫入到編譯文件中 * 將編譯后的文件include進來,即可輸出編譯后的文件 * 函數con_replace($content)用于替換模板文件(index.dwt)中的變量,即將php中的變量值賦給模板中的變量     * 通過一個可以匹配形式的正則表達式匹配模板文件中的內容,并將匹配到的值替換為的形式 * 匹配到內容,并將替換后的內容返回 ~~~ /*Smarty.ini.php文件:用于完成初始化smarty的工作*/<?php include "./libs/Smarty.class.php"; $tpl=new Smarty(); $tpl->template_dir="./Tpl"; $tpl->compile_dir="./Compile";?> ~~~ ~~~ <!--模板文件--><!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><{$title}></title></head><body><p>內容:<{$content}></p><p>作者:<{$auth}></p><p>網址:<{$website}></p></body></html> ~~~ ~~~ /*index.php文件*/<?php include "./Smarty.ini.php"; $title="深入淺出之Smarty模板引擎工作機制"; $content="Smarty模板引擎工作機制流程圖"; $auth="MarcoFly"; $website="www.MarcoFly.com"; $tpl->assign("title",$title); $tpl->assign("content",$content); $tpl->assign("auth",$auth); $tpl->assign("website",$website); $tpl->display("index.dwt");?> ~~~ 該index.php就是PHP程序員編寫的,可以從數據庫中獲取各種想要的數據,并保存到變量中,然后簡單的調用assign()函數將數據保存到數組中,并通過display()函數將編譯文件輸出 注:此編譯文件是php文件,通過服務器端執行,將結果輸出的客戶端的瀏覽器上 分析到這里,我們回過頭來分析下在[**深入淺出之Smarty模板引擎工作機制(一)**](http://www.cnblogs.com/hongfei/archive/2011/12/10/Smarty-one.html)中給出的關于編譯后的文件代碼: ~~~ <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><?php echo $this->arr["title"] ?></title></head><body><p>內容:<?php echo $this->arr["content"] ?></p><p>作者:<?php echo $this->arr["auth"] ?></p><p>網址:<?php echo $this->arr["website"] ?></p></body></html> ~~~ 由于我們已經通過**assign()函數**,將要賦給模板標簽中變量的值保存到了數組中了,即此時編譯后的模板文件,可以直接輸出該數組中的值了。 舉個例子: ~~~ $title="深入淺出之Smarty模板引擎工作機制"; ~~~ ~~~ $tpl->assign("title",$title); ~~~ ~~~ 當執行了以上兩句代碼后,在數組$arr中就存放著下標為:title,值為:深入淺出之Smarty模板引擎工作機制的關聯數組了。 ~~~ ~~~ 此時,就可以直接通過$this->arr['title']直接輸出該數組的值。 ~~~ ~~~ 至于對如何從<{$title}> ---> <?php echo $this->arr['title']?> 的轉換,不懂的讀者可以再仔細看下con_replace()函數。 ~~~ * * * 有了以上幾個文件之后,我們在瀏覽器中訪問index.php文件將得到以下結果: ![](http://pic002.cnblogs.com/images/2011/350329/2011121021375145.jpg) 到此,我們“開發”了一個自己的模板引擎,并且測試成功,當然,這只是供交流學習之用。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看