源代碼下載地址:深刻淺出之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代碼解釋:數據庫
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="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