PHP的自定義模板引擎使用方法

本文將詳細介紹PHP中的模板引擎。具有很好的參考價值。下面跟着小編一起來看下吧。

PHP的自定義模板引擎使用方法

在大多數的項目組中,開發一個Web程序都會出現這樣的流程:計劃文檔提交之後,前端工程師製作了網站的外觀模型,然後把它交給後端工程師,它們使用後端代碼實現程序邏輯,同時使用外觀模型做成基本架構,然後工程被返回到前端工程師繼續完善。就這樣工程可能在後端工程師和前端工程師之間來來回回好幾次。由於後端工程師不干預任何相關HTML標籤,同時也不需要前端代碼和後端代碼混合在一起。前端工程師只需要配置文件,動態區塊和其他的界面部分,不必要去接觸那些錯綜複雜的後端代碼。因此,這時候有一個很好的模板支持就顯得很重要了。本文將詳細介紹PHP中的模板引擎

  概述

什麼是網站模板?準確地說,是指網站頁面模板,即每個頁面僅是一個板式,包括結構、樣式和頁面佈局,是創建網頁內容的樣板,也可以理解爲已有的網頁框架。可以將模板中原有的內容替換成從服務器端數據庫中動態內容,目的是可以保持頁面風格一致

PHP是一種HTML內嵌式的在服務器端執行的腳本語言,所以大部分PHP開發出來的Web應用,初始的開發模板就是混合層的數據編程。雖然通過MVC設計模式可以把程序應用邏輯與網頁呈現邏輯強制性分離,但也只是將應用程序的輸入、處理和輸出分開,網頁呈現邏輯(視圖)還會有HTML代碼和PHP程序強耦合在一起。PHP腳本的編寫者必須既是網頁設計者,又是PHP開發者

現在已經有很多解決方案,可以將網站的頁面設計和PHP應用程序幾乎完全分離。這些解決方案稱爲“模板引擎”,它們正在逐步消除由於缺乏層次分離而帶來的難題。模板引擎的目的,就是要達到上述提到的邏輯分離的功能。它能讓程序開發者專注於資料的控制或是功能的達成。因此,模板引擎很適合公司的Web開發團隊使用,使每個人都能發揮其專長

模板引擎技術的核心比較簡單。只要將前端頁面指定爲模板文件,並將這個模板文件中動態的內容,如數據庫輸出、用戶交互等部分,定義成使用特殊“定界符”包含的“變量”,然後放在模板文件中相應的位置。當用戶瀏覽時,由PHP腳本程序打開該模板文件,並將模板文件中定義的變量進行替換。這樣,模板中的特殊變量被替換爲不同的動態內容時,就會輸出需要的頁面

目前,可以在PHP中應用的並且比較成熟的模板有很多,例如Smarty、PHPLIB、IPB等幾十種。使用這些通過PHP編寫的模板引擎,可以讓代碼脈絡更加清晰,結構更加合理化。也可以讓網站的維護和更新變得更容易,創造一個更加良好的開發環境,讓開發和設計工作更容易結合在一起。但是,沒有哪一個PHP模板是最合適、最完美的。因爲PHP模板就是大衆化的東西,並不是針對某個人開發的。如果能在對模板的特點、應用有清楚的認識基礎上,充分認識到模板的優勢劣勢,就可以知道是否選擇使用模板引擎或選擇使用哪個模板引擎

  自定義模板引擎類

自定義模板引擎,能夠更好的掌握模板引擎的工作機制,爲學習Smarty做好準備。更重要的是,屬於自己的PHP模板引擎永遠不是固定不變的,可以根據項目的需要爲其量身定製

在下例中,通過前面介紹的模板引擎概念創建了屬於自己的一個簡單模板引擎,可以用來處理模板的基本功能。例如:變量替換、分支結構、數組循環遍歷,以及模板之間相互嵌套等,如下所示:

<?php

/**

file: 類名爲MyTpl是自定義的模板引擎

通過該類對象加載模板文件並解析,將解析後的結果輸出

*/

class Mytpl {

public $template_dir = 'templates'; //定義模板文件存放的目錄

public $compile_dir = 'templates_c'; //定義通過模板引擎組合後文件存放目錄

public $left_delimiter = '<{'; //在模板中嵌入動態數據變量的左定界符號

public $right_delimiter = '}>'; //在模板中嵌入動態數據變量的右定界符號

private $tpl_vars = array(); //內部使用的臨時變量

/**

將PHP中分配的值會保存到成員屬性$tpl_vars中,用於將模板中對應的變量進行替換

@param string $tpl_var 需要一個字符串參數作爲關聯數組下標,要和模板中的變量名對應

@param mixed $value 需要一個標量類型的值,用來分配給模板中變量的值

*/

function assign($tpl_var, $value = null) {

if ($tpl_var != '')

$this->tpl_vars[$tpl_var] = $value;

}

/**

加載指定目錄下的模板文件,並將替換後的內容生成組合文件存放到另一個指定目錄下

@param string $fileName 提供模板文件的文件名

*/

function display($fileName) {

/* 到指定的目錄中尋找模板文件 */

$tplFile = $this->template_dir.'/'.$fileName;

/* 如果需要處理的模板文件不存在,則退出並報告錯誤 */

if(!file_exists($tplFile)) {

die("模板文件{$tplFile}不存在!");

}

/* 獲取組合的模板文件,該文件中的內容都是被替換過的 */

$comFileName = $this->compile_dir."/com_".$fileName.'';

/* 判斷替換後的文件是否存在或是存在但有改動,都需要重新創建 */

if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {

/* 調用內部替換模板方法 */

$repContent = $this->tpl_replace(file_get_contents($tplFile));

/* 保存由系統組合後的腳本文件 */

file_put_contents($comFileName, $repContent);

}

/* 包含處理後的模板文件輸出給客戶端 */

include($comFileName);

}