PHP實現簡易的模板引擎 1.MVC簡介 MVC 是一種使用 MVC(Model View Controller 模型 視圖 控制器)設計創建 Web 應用程式的模式(詳情自己百度): 1. Model(模型)表示應用程式核心(比如資料庫記錄列表)。 2. View(視圖)顯示數據(資料庫記錄) 3 ...
PHP實現簡易的模板引擎
1.MVC簡介
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程式的模式(詳情自己百度):
1. Model(模型)表示應用程式核心(比如資料庫記錄列表)。
2. View(視圖)顯示數據(資料庫記錄)
3. Controller(控制器)處理輸入(寫入資料庫記錄)。
MVC的流程圖如下(來源百度百科):
2.本文重點:模板引擎
在視圖層,PHP可以採用兩種方式編寫:
- PHP代碼和HTML代碼混寫,甚至JavaScript等
採用模板引擎使得數據和顯示分離,這種方式更易於維護。
首先讓我們來看一下混寫代碼:
<!DOCTYPE html> <html> <head> <title>混寫代碼</title> </head> <body> 商品信息: <?php mysql_connect("localhost","root","") or die("conect failed:".mysql_error()); mysql_select_db("shop"); $result = mysql_query("select * from sh_goods"); ?> <ul> <?php while (mysql_fetch_array($result)) {?> <li><?php echo $result['good_name']; ?></li> <?php } ?> </ul> <?php mysql_free_result($result); mysql_close(); ?> </body> </html>
這種方式往往隨著前端邏輯的複雜度變得越來越大,代碼的可讀性也會變得很差,代碼的可重用性也不好。(比如我們需要重覆的編寫從資料庫中獲取數據的代碼)
模板引擎有兩種機制
接下來,我們用原生態模板機制來實現
1.原生態機制
該機制主要是執行資料庫操作的代碼get_data.php單獨放到一個文件中,顯示的hmtl代碼show_page.php放到另一個文件中,然後在html代碼show_page.php中包含執行資料庫操作的代碼get_data.php.代碼如下:
get_data.php
<?php
mysql_connect("localhost","root","") or die("conect failed:".mysql_error());
mysql_select_db("shop");
$result = mysql_query("select * from sh_goods");
$data = array();
while (mysql_fetch_array($result)) {
$data[] = $result['good_name'];
}
mysql_free_result($result);
mysql_close();
?>
show_page.php
<!DOCTYPE html>
<html>
<head>
<title>分離代碼</title>
</head>
<body>
商品信息:
<ul>
<?php
include 'get_data.php';
foreach ($data as $key => $value) {
?>
<li><?php echo $value['good_name']; ?></li>
<?php } ?>
</ul>
</body>
</html>
該機制比較簡單,符合PHP的語法和使用的習慣,顯然比混寫代碼更容易維護。但是,有時考慮到網站的性能,我們想要緩存代碼的時候,這種方法就不能提供支持了。類似的,錯誤處理,可配置化,脫離php語法等高級功能也不容易實現。
2.更強大的模板機制
該機制與上一個機制剛好相反,在負責數據操作的文件中包含模板,模板只負責顯示即可,不用考慮php操作。
本引擎的執行流程如下:
該模板引擎有以下幾部分組成
- Cache文件夾: 該文件夾存放編譯完成後的文件
- Template文件夾: 該文件夾存放模板文件
- Template.class.php Template類提供了讀取和設置配置的方法,註入變數方法,展示模板的方法。
- Compile.class.php Compile類提供了模板解析方法,模板解析方法是通過預先定義好的正則表達式匹配,並替換成相應的PHP代碼,同時也添加了PHP原生代碼的支持。我們也可以簡單地通過添加正則表達式,來擴充變數標簽。
由於代碼有點長,所以放在github上,O(∩_∩)O~,代碼比較簡單,可以加深我們對模板引擎的理解,smarty等更複雜,但基本原理差不多就是這樣。
具體代碼鏈接如下:https://www.github.com/fengyuhetao/Code.git,該目錄Template Engine中就是簡易的模板引擎代碼。