當前位置:才華齋>計算機>php語言>

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

php語言 閱讀(6.24K)

本文將詳細介紹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);

}