源代碼下載地址:深入淺出之Smarty模板引擎工作機制
接下來根據以下的Smarty模板引擎原理流程圖開發一個自己的模板引擎用于學習,以便加深理解。
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代碼解釋:
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文件
/*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=" $website=" $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="$tpl->assign("title",$title);當執行了以上兩句代碼后,在數組$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