開發一個web項目,通常分為兩部分,一部分是GUI,即界面、美工,使用HTML,CSS,JS編寫,另一部分則是業務邏輯,即程序、功能,使用PHP編寫。而模板引擎則是聯繫這兩部分的「橋樑」,可理解成一個PHP類,裡面定義了許多方法,實現了將PHP的原始輸出加載上界面樣式後再輸出。
沒用模板之前的編寫的代碼是這樣的:
<?php
$title = 「標題」;
$content = 「內容」;
?>
<html>
<head><title><?php echo $title; ?></title></head>
<body><?php echo $content; ?></body>
</html>
這樣的話美工與邏輯沒有分離,簡單的說就是PHP程序員不僅要寫程序還要精通美工,這往往十分困難,因此需要將這兩部分工作分開。
在此通過自己創建一個簡單的模板引擎為例子,更好的體會模板引擎的原理。
之前說了開發一個web項目分成GUI與業務邏輯兩部分,因此我們創建兩個文件夾,一個命名為「templates」,裡邊存放模板,新建一個tpl.html文件,另一個命名為「PHP」,裡邊存放業務邏輯,新建一個index.php文件。
tpl.html文件代碼通常是這樣:
<html>
<head><title><{$title}></title></head>
<body><{ $content;}></body>
</html>
可以看出來,和之前的代碼相比,tpl.html中只有html代碼,沒有php代碼,但是增加了新的標籤,這類標籤是自己定義的,裡面的內容只有經過模板引擎編譯後才能被識別,編譯後的文件存放在「templates_c」文件夾下。這個文件主要是界面設計用的,將大量使用到CSS,JS等技術。
這時候tpl.html和index.php仍舊是分離的,互不干擾,因此需要一個「橋樑」連接,即模板引擎,其實就是一個PHP類,故在此可以創建一個mytpl.class.php的PHP文件。
mytpl.class.php文件通常定義一個類MyTpl,類中需定義一個數組tpl_var[]用於存放tpl.html中自定義內容標籤的參數,此外還需定義一些方法,這些方法最主要的目的是將tpl.hml中無法識別的的內容標籤轉換成PHP語句,然後再寫到一個「templates_c」文件夾下的tpl_c.html中,這個過程就是所謂的編譯。
通常tpl_c.html文件的代碼是這樣的:
<html>
<head><title><?php echo $this->tpl_var[「title」]; ?></head>
<body><?php echo $this->tpl_var[「content」]; ?}></body>
</html>
可以看出上面的代碼是可以被識別的,因為自定義的內容標籤已經被替換成PHP語句了,但是title和content的值是多少我們還不得而知,這時候之前創建的index.php要上場了,通常它代碼是這樣的:
include 「tpl.class.php文件」;//加載模板引擎
$tpl = new MyTpl();//實例化一個模板類
$title = 「標題」;
$content = 「內容」;
$tpl->assign(「title」,$title);//調用模板類中的方法,分配變量
$tpl->assign(「content」,$content);
$tpl->display(「tpl.html」);//調用模板類中的方法,用於顯示編譯後的內容
上面的代碼只是一些簡單的描述代碼,其中的變量的值可以是直接定義的也可以是從數據庫中獲取的,此外該文件還可以編寫一些複雜的PHP程序,這也就是之前說的業務邏輯。
最後用一幅圖概括:
這樣GUI和業務邏輯的工作就分離了,美工設計人員只需要編寫模板文件就可以改變web的界面,而PHP程序員則可以專心編寫自己的程序。
公司內部一般都有自己的模板引擎,而通常模板引擎自己寫的話完全沒有必要,因為市面上已經有一些很成熟的模板引擎了,比如Smarty,我們只需要懂得如何使用它就好了。
本文出自 「程序員的生與死」 博客,請務必保留此出處http://sorryworld.blog.51cto.com/7677452/1271645
留言列表