PHP實現簡易的模板引擎

来源:http://www.cnblogs.com/shadowHouse/archive/2016/05/27/5534524.html
-Advertisement-
Play Games

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可以採用兩種方式編寫:

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現階段php如果要操作mysql資料庫 php給我們提供了3套庫 1、mysql擴展庫 面向過程操作 2、mysqli擴展庫 面向對象操作和麵向過程操作並存 安全性和效率高於mysql擴展庫 3、PDO擴展庫 面向對象操作 今天這篇博文主要要談談mysql擴展庫和mysqli擴展庫 主要是記錄了著2 ...
  • ha_proxy配置文件修改程式ha_file 為存儲配置信息的文件。運行的時候對該文件進行操作。1.查詢信息:用戶輸入功能變數名稱,獲得功能變數名稱相關信息2.修改配置文件:用戶輸入的格式應該為 {"backend": "test.oldboy.org","record":{"server": "100.1.7. ...
  • 這是一個表單的時代。。。 我們在瀏覽器中編輯自己的信息,會遇到上傳頭像;在文庫中,我們會上傳文檔......到處存在“上傳”這個詞。 php是最好的語言(其他語言的程式猿們不要打我...)。php在處理交互方面有天然的優勢,自然有強大的函數來處理上傳文件。 和提交一般的數據一樣,上傳文件也需要表單。 ...
  • java為我們提供了一個集合的工具類,方便我們對集合進行操作,裡面的方法都是靜態方法。 Collections.sort()方法,參數:List<T>集合對象,這個對象帶著泛型,是為了保證集合中的元素具備可比較性,因此這個返回值的泛型就會特殊點, <T extends Comparable <? s ...
  • 選自Mr.kuang http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.html /* * pku3461(Oulipo), hdu1711(Number Sequence) * 這個模板 字元串是從0開始的 * Next數組是從1... ...
  • 布爾類型其實可以算是一種特殊的數字,下麵是 help() 函數得到的幫助信息: Help on class bool in module __builtin__: class bool(int) | bool(x) -> bool | | Returns True when the argument ...
  • 1.什麼是Servlet? Servlet(Servlet Applet),全程Java Servlet,是用Java編寫的伺服器端程式,其主要功能在於互動式地瀏覽和修改數據,生成動態WEB內容。俠義的servlet是指Java語言實現的一個介面,廣義的servlet是指任何實現了這個servlet ...
  • 最初版本: #include<stdio.h> int checkPassword(); int add(int x,int y); int sub(int x,int y); int multi(int x,int y); float quo(float x1,float y1); int com ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...