PHP實現簡易的模板引擎


PHP實現簡易的模板引擎

1.MVC簡介

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式(詳情自己百度):

1. Model(模型)表示應用程序核心(比如數據庫記錄列表)。
2. View(視圖)顯示數據(數據庫記錄)
3. Controller(控制器)處理輸入(寫入數據庫記錄)。

[百度百科]

MVC的流程圖如下(來源百度百科):
流程圖

2.本文重點:模板引擎

在視圖層,PHP可以采用兩種方式編寫:

  1. PHP代碼和HTML代碼混寫,甚至JavaScript等
  2. 采用模板引擎使得數據和顯示分離,這種方式更易於維護。

首先讓我們來看一下混寫代碼:

    <!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操作。
本引擎的執行流程如下:
執行流程

該模板引擎有以下幾部分組成

  1. Cache文件夾: 該文件夾存放編譯完成后的文件
  2. Template文件夾: 該文件夾存放模板文件
  3. Template.class.php Template類提供了讀取和設置配置的方法,注入變量方法,展示模板的方法。
  4. Compile.class.php Compile類提供了模板解析方法,模板解析方法是通過預先定義好的正則表達式匹配,並替換成相應的PHP代碼,同時也添加了PHP原生代碼的支持。我們也可以簡單地通過添加正則表達式,來擴充變量標簽。

由於代碼有點長,所以放在github上,O(∩_∩)O~,代碼比較簡單,可以加深我們對模板引擎的理解,smarty等更復雜,但基本原理差不多就是這樣。
具體代碼鏈接如下:https://www.github.com/fengyuhetao/Code.git,該目錄Template Engine中就是簡易的模板引擎代碼。

說明:該源代碼是基於《PHP核心技術與最佳實踐》一書中的案例,本人只是稍作修改,非原創。文章為原創。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM