精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入淺出之Smarty模板引擎工作機制(二)
源代碼下載地址:深入淺出之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代碼解釋:

  • $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=" $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

本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 连江县| 陇西县| 平顶山市| 内乡县| 新宁县| 响水县| 南投县| 周宁县| 海南省| 陵水| 诏安县| 宽甸| 凤城市| 凭祥市| 日土县| 二连浩特市| 建阳市| 南阳市| 那坡县| 新龙县| 台山市| 乡宁县| 兴城市| 本溪市| 南安市| 白城市| 桦川县| 肥西县| 定南县| 古田县| 西乌珠穆沁旗| 慈利县| 石门县| 江西省| 新巴尔虎左旗| 舟曲县| 山阳县| 象州县| 昌乐县| 大名县| 民丰县|