1. 程式人生 > >PHP實現簡易的模板引擎

PHP實現簡易的模板引擎

修改 ava 比較 class 技術 寫代碼 輸入 cmod ima

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核心技術與最佳實踐》一書中的案例,本人只是稍作修改,非原創。文章為原創。

PHP實現簡易的模板引擎