深刻淺出之Smarty模板引擎工做機制(二)

源代碼下載地址:深刻淺出之Smarty模板引擎工做機制
接下來根據如下的Smarty模板引擎原理流程圖開發一個本身的模板引擎用於學習,以便加深理解。

 

  Smarty模板引擎的原理,實際上是這麼一個過程:
  把模板文件編譯成php文件,而後每次都去讀取下模板的修改時間,沒有修改就不編譯。而後include這個「編譯」後的PHP文件。
  所謂編譯也就是模板用正則替換成含PHP代碼的過程。
  實際上並不會每次請求都編譯,因此性能尚可。php

   模板文件和php程序文件通過模板引擎的編譯後合成爲一個文件,即編譯後的文件。html

接下來,咱們根據該原理流程寫一個簡單的模板引擎。。。。。。程序員

  先貼上核心代碼:web

  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用於存放編譯後的文件

 

  • assign($content,$replacment=null)函數的工做機制是將每次要傳遞給模板中的變量的值經過語句:$this->arr[$content]=$replacment;保存到數組中。  

     那爲什麼要$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中的變量值賦給模板中的變量    
    • 經過一個能夠匹配<{$title}>形式的正則表達式匹配模板文件中的內容,並將匹配到的值替換爲<?php echo $title?>的形式
    • 匹配到內容,並將替換後的內容返回
複製代碼
/*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模板引擎工做機制(一)中給出的關於編譯後的文件代碼:

複製代碼
<!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文件將獲得如下結果:

 

到此,咱們「開發」了一個本身的模板引擎,而且測試成功,固然,這只是供交流學習之用。若是你以爲這篇文章對你瞭解smarty模板引擎的工做機制有所幫助的話,請幫忙頂一頂哈O(∩_∩)O~

文章出自:WEB開發_小飛

轉載請註明出處:http://www.cnblogs.com/hongfei/archive/2011/12/10/Smarty-two.html

相關文章
相關標籤/搜索