PHP的自定義模板引擎
前面的話
在大多數(shù)的項(xiàng)目組中,開發(fā)一個(gè)Web程序都會(huì)出現(xiàn)這樣的流程:計(jì)劃文檔提交之后,前端工程師制作了網(wǎng)站的外觀模型,然后把它交給后端工程師,它們使用后端代碼實(shí)現(xiàn)程序邏輯,同時(shí)使用外觀模型做成基本架構(gòu),然后工程被返回到前端工程師繼續(xù)完善。就這樣工程可能在后端工程師和前端工程師之間來(lái)來(lái)回回好幾次。由于后端工程師不干預(yù)任何相關(guān)HTML標(biāo)簽,同時(shí)也不需要前端代碼和后端代碼混合在一起。前端工程師只需要配置文件,動(dòng)態(tài)區(qū)塊和其他的界面部分,不必要去接觸那些錯(cuò)綜復(fù)雜的后端代碼。因此,這時(shí)候有一個(gè)很好的模板支持就顯得很重要了。本文將詳細(xì)介紹PHP中的模板引擎
概述
什么是網(wǎng)站模板?準(zhǔn)確地說(shuō),是指網(wǎng)站頁(yè)面模板,即每個(gè)頁(yè)面僅是一個(gè)板式,包括結(jié)構(gòu)、樣式和頁(yè)面布局,是創(chuàng)建網(wǎng)頁(yè)內(nèi)容的樣板,也可以理解為已有的網(wǎng)頁(yè)框架??梢詫⒛0逯性械膬?nèi)容替換成從服務(wù)器端數(shù)據(jù)庫(kù)中動(dòng)態(tài)內(nèi)容,目的是可以保持頁(yè)面風(fēng)格一致
PHP是一種HTML內(nèi)嵌式的在服務(wù)器端執(zhí)行的腳本語(yǔ)言,所以大部分PHP開發(fā)出來(lái)的Web應(yīng)用,初始的開發(fā)模板就是混合層的數(shù)據(jù)編程。雖然通過(guò)MVC設(shè)計(jì)模式可以把程序應(yīng)用邏輯與網(wǎng)頁(yè)呈現(xiàn)邏輯強(qiáng)制性分離,但也只是將應(yīng)用程序的輸入、處理和輸出分開,網(wǎng)頁(yè)呈現(xiàn)邏輯(視圖)還會(huì)有HTML代碼和PHP程序強(qiáng)耦合在一起。PHP腳本的編寫者必須既是網(wǎng)頁(yè)設(shè)計(jì)者,又是PHP開發(fā)者
現(xiàn)在已經(jīng)有很多解決方案,可以將網(wǎng)站的頁(yè)面設(shè)計(jì)和PHP應(yīng)用程序幾乎完全分離。這些解決方案稱為“模板引擎”,它們正在逐步消除由于缺乏層次分離而帶來(lái)的難題。模板引擎的目的,就是要達(dá)到上述提到的邏輯分離的功能。它能讓程序開發(fā)者專注于資料的控制或是功能的達(dá)成。因此,模板引擎很適合公司的Web開發(fā)團(tuán)隊(duì)使用,使每個(gè)人都能發(fā)揮其專長(zhǎng)
模板引擎技術(shù)的核心比較簡(jiǎn)單。只要將前端頁(yè)面指定為模板文件,并將這個(gè)模板文件中動(dòng)態(tài)的內(nèi)容,如數(shù)據(jù)庫(kù)輸出、用戶交互等部分,定義成使用特殊“定界符”包含的“變量”,然后放在模板文件中相應(yīng)的位置。當(dāng)用戶瀏覽時(shí),由PHP腳本程序打開該模板文件,并將模板文件中定義的變量進(jìn)行替換。這樣,模板中的特殊變量被替換為不同的動(dòng)態(tài)內(nèi)容時(shí),就會(huì)輸出需要的頁(yè)面
目前,可以在PHP中應(yīng)用的并且比較成熟的模板有很多,例如Smarty、PHPLIB、IPB等幾十種。使用這些通過(guò)PHP編寫的模板引擎,可以讓代碼脈絡(luò)更加清晰,結(jié)構(gòu)更加合理化。也可以讓網(wǎng)站的維護(hù)和更新變得更容易,創(chuàng)造一個(gè)更加良好的開發(fā)環(huán)境,讓開發(fā)和設(shè)計(jì)工作更容易結(jié)合在一起。但是,沒(méi)有哪一個(gè)PHP模板是最合適、最完美的。因?yàn)镻HP模板就是大眾化的東西,并不是針對(duì)某個(gè)人開發(fā)的。如果能在對(duì)模板的特點(diǎn)、應(yīng)用有清楚的認(rèn)識(shí)基礎(chǔ)上,充分認(rèn)識(shí)到模板的優(yōu)勢(shì)劣勢(shì),就可以知道是否選擇使用模板引擎或選擇使用哪個(gè)模板引擎
自定義模板引擎類
自定義模板引擎,能夠更好的掌握模板引擎的工作機(jī)制,為學(xué)習(xí)Smarty做好準(zhǔn)備。更重要的是,屬于自己的PHP模板引擎永遠(yuǎn)不是固定不變的,可以根據(jù)項(xiàng)目的需要為其量身定制
在下例中,通過(guò)前面介紹的模板引擎概念創(chuàng)建了屬于自己的一個(gè)簡(jiǎn)單模板引擎,可以用來(lái)處理模板的基本功能。例如:變量替換、分支結(jié)構(gòu)、數(shù)組循環(huán)遍歷,以及模板之間相互嵌套等,如下所示:
<?php
/**
file: mytpl.class.php 類名為MyTpl是自定義的模板引擎
通過(guò)該類對(duì)象加載模板文件并解析,將解析后的結(jié)果輸出
*/
class Mytpl {
public $template_dir = 'templates'; //定義模板文件存放的目錄
public $compile_dir = 'templates_c'; //定義通過(guò)模板引擎組合后文件存放目錄
public $left_delimiter = '<{'; //在模板中嵌入動(dòng)態(tài)數(shù)據(jù)變量的左定界符號(hào)
public $right_delimiter = '}>'; //在模板中嵌入動(dòng)態(tài)數(shù)據(jù)變量的右定界符號(hào)
private $tpl_vars = array(); //內(nèi)部使用的臨時(shí)變量
/**
將PHP中分配的值會(huì)保存到成員屬性$tpl_vars中,用于將模板中對(duì)應(yīng)的變量進(jìn)行替換
@param string $tpl_var 需要一個(gè)字符串參數(shù)作為關(guān)聯(lián)數(shù)組下標(biāo),要和模板中的變量名對(duì)應(yīng)
@param mixed $value 需要一個(gè)標(biāo)量類型的值,用來(lái)分配給模板中變量的值
*/
function assign($tpl_var, $value = null) {
if ($tpl_var != '')
$this->tpl_vars[$tpl_var] = $value;
}
/**
加載指定目錄下的模板文件,并將替換后的內(nèi)容生成組合文件存放到另一個(gè)指定目錄下
@param string $fileName 提供模板文件的文件名
*/
function display($fileName) {
/* 到指定的目錄中尋找模板文件 */
$tplFile = $this->template_dir.'/'.$fileName;
/* 如果需要處理的模板文件不存在,則退出并報(bào)告錯(cuò)誤 */
if(!file_exists($tplFile)) {
die("模板文件{$tplFile}不存在!");
}
/* 獲取組合的模板文件,該文件中的內(nèi)容都是被替換過(guò)的 */
$comFileName = $this->compile_dir."/com_".$fileName.'.php';
/* 判斷替換后的文件是否存在或是存在但有改動(dòng),都需要重新創(chuàng)建 */
if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
/* 調(diào)用內(nèi)部替換模板方法 */
$repContent = $this->tpl_replace(file_get_contents($tplFile));
/* 保存由系統(tǒng)組合后的腳本文件 */
file_put_contents($comFileName, $repContent);
}
/* 包含處理后的模板文件輸出給客戶端 */
include($comFileName);
}
/**
內(nèi)部使用的私有方法,使用正則表達(dá)式將模板文件'<{ }>'中的語(yǔ)句替換為對(duì)應(yīng)的值或PHP代碼
@param string $content 提供從模板文件中讀入的全部?jī)?nèi)容字符串
@return $repContent 返回替換后的字符串
*/
private function tpl_replace($content) {
/* 將左右定界符號(hào)中,有影響正則的特殊符號(hào)轉(zhuǎn)義 例如,<{ }>轉(zhuǎn)義\<\{ \}\> */
$left = preg_quote($this->left_delimiter, '/');
$right = preg_quote($this->right_delimiter, '/');
/* 匹配模板中各種標(biāo)識(shí)符的正則表達(dá)式的模式數(shù)組 */
$pattern = array(
/* 匹配模板中變量 ,例如,"<{ $var }>" */
'/'.$left.'\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*'.$right.'/i',
/* 匹配模板中if標(biāo)識(shí)符,例如 "<{ if $col == "sex" }> <{ /if }>" */
'/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/ies',
/* 匹配elseif標(biāo)識(shí)符, 例如 "<{ elseif $col == "sex" }>" */
'/'.$left.'\s*else\s*if\s*(.+?)\s*'.$right.'/ies',
/* 匹配else標(biāo)識(shí)符, 例如 "<{ else }>" */
'/'.$left.'\s*else\s*'.$right.'/is',
/* 用來(lái)匹配模板中的loop標(biāo)識(shí)符,用來(lái)遍歷數(shù)組中的值, 例如 "<{ loop $arrs $value }> <{ /loop}>" */
'/'.$left.'\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*'.$right.'(.+?)'.$left.'\s*\/loop\s*'.$right.'/is',
/* 用來(lái)遍歷數(shù)組中的鍵和值,例如 "<{ loop $arrs $key => $value }> <{ /loop}>" */
'/'.$left.'\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*=>\s*\$(\S+)\s*'.$right.'(.+?)'.$left.'\s*\/loop \s*'.$right.'/is',
/* 匹配include標(biāo)識(shí)符, 例如,'<{ include "header.html" }>' */
'/'.$left.'\s*include\s+[\"\']?(.+?)[\"\']?\s*'.$right.'/ie'
);
/* 替換從模板中使用正則表達(dá)式匹配到的字符串?dāng)?shù)組 */
$replacement = array(
/* 替換模板中的變量 <?php echo $this->tpl_vars["var"]; */
'<?php echo $this->tpl_vars["${1}"]; ?>',
/* 替換模板中的if字符串 <?php if($col == "sex") { ?> <?php } ?> */
'$this->stripvtags(\'<?php if(${1}) { ?>\',\'${2}<?php } ?>\')',
/* 替換elseif的字符串 <?php } elseif($col == "sex") { ?> */
'$this->stripvtags(\'<?php } elseif(${1}) { ?>\',"")',
/* 替換else的字符串 <?php } else { ?> */
'<?php } else { ?>',
/* 以下兩條用來(lái)替換模板中的loop標(biāo)識(shí)符為foreach格式 */
'<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}<?php } ?>',
'<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}<?php } ?>',
/*替換include的字符串*/
'file_get_contents($this->template_dir."/${1}")'
);
/* 使用正則替換函數(shù)處理 */
$repContent = preg_replace($pattern, $replacement, $content);
/* 如果還有要替換的標(biāo)識(shí),遞歸調(diào)用自己再次替換 */
if(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {
$repContent = $this->tpl_replace($repContent);
}
/* 返回替換后的字符串 */
return $repContent;
}
/**
內(nèi)部使用的私有方法,用來(lái)將條件語(yǔ)句中使用的變量替換為對(duì)應(yīng)的值
@param string $expr 提供模板中條件語(yǔ)句的開始標(biāo)記
@param string $statement 提供模板中條件語(yǔ)句的結(jié)束標(biāo)記
@return strin 將處理后的條件語(yǔ)句相連后返回
*/
private function stripvtags($expr, $statement='') {
/* 匹配變量的正則 */
$var_pattern = '/\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*/is';
/* 將變量替換為值 */
$expr = preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr);
/* 將開始標(biāo)記中的引號(hào)轉(zhuǎn)義替換 */
$expr = str_replace("\\\"", "\"", $expr);
/* 替換語(yǔ)句體和結(jié)束標(biāo)記中的引號(hào) */
$statement = str_replace("\\\"", "\"", $statement);
/* 將處理后的條件語(yǔ)句相連后返回 */
return $expr.$statement;
}
}
?>
在Mytpl類中聲明的多個(gè)方法中,除被封裝過(guò)的方法之外,只有兩個(gè)公有方法assign()和display()在創(chuàng)建對(duì)象以后可以被凋用。其中assign()方法用來(lái)將PHP腳本中的數(shù)據(jù)分配給模板中對(duì)應(yīng)的變量,display()方法則用來(lái)將特定的templates目錄下的模板文件加載到PHP腳本中。同時(shí)將模板文件中使用“<{”和“>>”標(biāo)記聲明的自定義模板語(yǔ)句,匹配出來(lái)并替換成相對(duì)應(yīng)的PHP語(yǔ)法格式,然后將替換后的內(nèi)容保存在特定的templates_c目錄下。在運(yùn)行時(shí)還要編譯成一個(gè)非模板技術(shù)的PHP文件,并將其以模板文件名加上“com_”前綴和“.php”的擴(kuò)展名形式保存。再通過(guò)include()函數(shù)將處理后的模板文件包含,并使用PHP解析后發(fā)送給客戶端
使用模板引擎
使用自定義的模板引擎比較容易,都是自己定義的語(yǔ)法格式。但要記住,所有流行的模板引繁解決方案都遵循同樣的一組相同的核心實(shí)現(xiàn)原則,就是與編程語(yǔ)言一樣,學(xué)習(xí)了一種語(yǔ)言就可以更容易地掌握其他語(yǔ)言。使用模板引擎最主要的原因就是將前端工程師和后端工程師的工作分開,所以模板引擎不僅后端工程師需要使用,前端工程師也需要使用
1、后端工程師對(duì)模板引擎的使用
在PHP腳本中包含模板引擎類所在的文件。如下所示:
require("mytpl.class.php"); //包含模板引擎類,相當(dāng)于模板引擎安裝
創(chuàng)建模板引擎類的對(duì)象并對(duì)一些成員屬性進(jìn)行初始化賦值。如下所示:
$tpl=new MyTpl(); //創(chuàng)建模板引擎類的對(duì)象,也可以根據(jù)參數(shù)對(duì)成員初始化
將動(dòng)態(tài)數(shù)據(jù)(包括標(biāo)量和數(shù)組類型的數(shù)據(jù),例如從數(shù)據(jù)庫(kù)的表中獲得的數(shù)據(jù)數(shù)組)使用模板引擎對(duì)象中的assign()方法分配給模板文件,這個(gè)方法可以使用多次,將任意多個(gè)變量分配給模板。如下所示:
$tpl->assign("var","this is a value"); //可以分配標(biāo)量類型數(shù)據(jù),可以使用多次
$tpl->assign("arr",array(array(1,2),array("a","b"))); //也可以分配數(shù)組包括多維數(shù)組
在PHP腳本中通過(guò)調(diào)用模板對(duì)象中的display()方法,并將模板文件名作為參數(shù)傳入,就會(huì)加載指定目錄中對(duì)應(yīng)的模板文件到PHP腳本中。再通過(guò)模板引擎中的替換方法對(duì)模板中自定義的語(yǔ)法進(jìn)行解析,然后輸出處理后的模板。如下所示:
$tpl->display("test.tpl"); //參數(shù)“test.tpl”為特定目錄下的模板文件
2、前端工程師對(duì)模板引擎的使用
前端工程師需要將編寫的模板文件存放到指定的目錄中,這個(gè)目錄是通過(guò)在模板對(duì)象中使用$template_dir屬性指定的,默認(rèn)的設(shè)置是當(dāng)前目錄下的“templates”目錄。另外,模板文件的命名以及后綴名的設(shè)置可以隨意,例如index.tpl、test.htm、header.tp;等
模板文件是通過(guò)使用HTML、CSS以及javascript等Web前臺(tái)語(yǔ)言以編寫的純靜態(tài)負(fù)而。但可以在模板文件中使用“<{”和“}>”兩個(gè)分隔符中間定義一個(gè)變量(類似PHP中的變量格式),該變量可以接受并輸出由PHP腳本中分配過(guò)來(lái)的動(dòng)態(tài)數(shù)據(jù)。在模板中使用的“<{”和“}>”兩個(gè)分隔符對(duì),也可以根據(jù)個(gè)人愛(ài)好在模板引擎類中修改。如下所示:
姓名:<{$name}>,年齡:<{$age}>,性別:<{$sex}> //模板中使用占位符
如果在PHP腳本中是將數(shù)組分配給模板,也可以在模板中進(jìn)行遍歷,還可以通過(guò)嵌套的方式遍歷多維數(shù)組。使用的是在模板引擎中定義的“<{loop}>”標(biāo)記對(duì),使用的方式和PHP中foreach結(jié)構(gòu)的語(yǔ)法格式相似。如下所示:
<{loop $arr $value }> //遍歷數(shù)組$arr中的元素值
數(shù)組中的元素值<{$value}> //每次遍歷輸出元素中的值
<{/loop}> //在模板中遍歷數(shù)組的結(jié)束標(biāo)記
<{loop $arr $key=>$value }> //遍歷數(shù)組$arr中的元素下標(biāo)和元素值
數(shù)組中的元素鍵<{$key}> //每次遍歷輸出元素中的下標(biāo)
數(shù)組中的元素值<{$value}> //每次遍歷輸出元素中的值
<{/loop}> //在模板中遍歷數(shù)組的結(jié)束標(biāo)記
<{loop $arr $value }> //遍歷數(shù)組$arr中的元素值
<{loop $arr $data }> //使用嵌套標(biāo)記遍歷二維數(shù)組
數(shù)組中的元素值<{$value}> //每次遍歷輸出元素中的值
<{/loop}> //在模板中遍歷數(shù)組的內(nèi)層結(jié)束標(biāo)記
<{/loop}> //在模板中遍歷數(shù)組的外層結(jié)束標(biāo)記
模板引擎還可以解析在模板文件中使用特殊標(biāo)記編寫的分支結(jié)構(gòu),語(yǔ)法風(fēng)格也是和PHP的分支結(jié)構(gòu)類似。是通過(guò)在模板文件中使用“<{if}>”標(biāo)記對(duì)實(shí)現(xiàn)選擇結(jié)構(gòu),也可以實(shí)現(xiàn)多路分支和嵌套分支的選擇結(jié)構(gòu)。如下所示:
<{if($var=="red")}>
<p style="color:red">這是“紅色”的字</p>
<{elseif($var=="green")}>
<p style="color:green">這是“綠色”的字</p>
<{else}>
<{if($size=20)}>
<p style="font-size:20">這是“20px”大小的字</p>
<{/if}>
<{/if}>
在自定義的模板引擎中,也添加了在模板文件中包含其他模板文件的功能。可以使用“<{include‘子模板文件名'}>”標(biāo)記將子模板包含到當(dāng)前模板中,還支持在子模板中再次包括另外的子模板。如下所示:
<{include 'other.tpl' }>
使用示例分析
通過(guò)在程序中加載模板引擎可以將前端語(yǔ)言與后端語(yǔ)言的代碼分開。首先在PHP程序中獲取數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),再通過(guò)加載模板引擎將數(shù)據(jù)分配出去,然后將模板文件再通過(guò)模板引擎加載并處理后輸出。所以PHP程序只是創(chuàng)建動(dòng)態(tài)數(shù)據(jù),加載模板引擎并將動(dòng)態(tài)數(shù)據(jù)分配給模板,完成了PHP程序的工作。而模板的設(shè)汁也只需要前端工程師獨(dú)立完成,使用HTML、CSS及javascript等前臺(tái)頁(yè)面設(shè)計(jì)語(yǔ)言編寫。另外,在模板文件中還需要使用模板引擎可以解析的標(biāo)記,將PHP中分配過(guò)來(lái)的動(dòng)態(tài)數(shù)據(jù)在模板中引用
1、數(shù)據(jù)庫(kù)的設(shè)計(jì)
假設(shè)數(shù)據(jù)庫(kù)服務(wù)器在“l(fā)ocalhost”主機(jī)上,連接的用戶名和密碼分別為“admin”和“123456”,在該服務(wù)器上創(chuàng)建一個(gè)名為“mydb”的數(shù)據(jù)庫(kù),并在該數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為“User”的用戶表。創(chuàng)建該表的SQL査詢語(yǔ)句如下所示:
CREATE TABLE User( id SMALLINT(3) NOT NULL AUTO_INCREMENT, name VARCHAR(10) NOT NULL DEFAULT '', sex VARCHAR(4) NOT NULL DEFAULT '', age SMALLINT(2) NOT NULL DEFAULT '0', email VARCHAR(20) NOT NULL DEFAULT '', PRIMARY KEY (id) );
用戶表User創(chuàng)建完成以后,接著可以向該表中插入一些數(shù)據(jù)作為示例演示使用,SQL查詢語(yǔ)句如下所示:
INSERT INTO User (name,sex,age,email) VALUES
("a","男",27,"a@a.com"),
("b","女",22,"b@b.com"),
("c","女",30,"c@c.com"),
("d","女",24,d@d.com);

2、模板的設(shè)計(jì)
模板的設(shè)計(jì)不要出現(xiàn)任何的PHP代碼,可以由前端人員來(lái)完成。在自定義的模板引擎中,規(guī)定了要到指定的目錄中去尋找模板文件,這個(gè)特定的目錄可以在創(chuàng)建模板引擎對(duì)象時(shí)指定,也可以使用默認(rèn)的目錄設(shè)置,默認(rèn)可以將模板文件存放在當(dāng)前目錄中的“templates”目錄下。本例共需要三個(gè)模板文件main.tpl、header.tpl和footer.tpl,都存放在這個(gè)默認(rèn)的目錄設(shè)置中。這三個(gè)模板文件的代碼如下所示:
模板的頭部文件header.tpl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> <{$title}> </title>
</head>
<body>
模板的尾部文件footer.tpl
<div style="width:200px;margin: 0 auto;">##### <{$author}> #####</div>
</body>
</html>
主模板文件main.tpl
<{include 'header.tpl'}>
<table border="1" align="center" width="500">
<{ loop $users $user }>
<tr>
<{loop $user $u }>
<{if $u == "男" }>
<td style="color:green">
<{elseif $u == "女"}>
<td style="color:red">
<{else}>
<td>
<{/if}>
<{$u}></td>
<{/loop}>
</tr>
<{/loop}>
</table>
<{include 'footer.tpl'}>
文件main.tpl是主模板文件,在該文件中使用<{include"header.tpl"}>和<{include"footer.tpl"}>兩個(gè)標(biāo)記分別在該文件的頂部和底部,將獨(dú)立的頭部和尾部模板文件包含到這個(gè)主模板文件中。并在該文件中使用<{tableName}>標(biāo)記獲取從PHP中動(dòng)態(tài)分配過(guò)來(lái)的表名,以及使用雙層<{loop}>標(biāo)記嵌套,遍歷從PHP中動(dòng)態(tài)分配過(guò)來(lái)的在數(shù)據(jù)庫(kù)中獲取到的二維數(shù)組$Users,還在<{loop}>標(biāo)記中使用條件選擇標(biāo)記<{if}>組合,將數(shù)據(jù)中性別為“男”的表格背景設(shè)置為紅色和一些其他判斷。被包含進(jìn)來(lái)的頭部模板文件header.tpl和尾部模板文件footer.tpl也同樣可以獲取從PHP中動(dòng)態(tài)分配給模板的數(shù)據(jù)
3、PHP程序設(shè)計(jì)
通過(guò)模板引擎的使用,PHP程序員在編寫代碼時(shí),只需要PHP一種語(yǔ)言就可以了,不用再去使用HTML、CSS以及javascript等頁(yè)面設(shè)計(jì)語(yǔ)言完成前端的工作了。下面是一個(gè)文件名為index.php的PHP腳本文件,和模板引擎類所在的文件mytpl_class.php在同一個(gè)目錄下。代碼如下所示:
<?php
//包含模板引擎類
include "mytpl.class.php";
//創(chuàng)建模板引擎對(duì)象
$tpl = new Mytpl;
//連接數(shù)據(jù)庫(kù)
$pdo = new PDO("mysql:host=localhost;dbname=mydb", "admin", "123456");
//執(zhí)行SQL語(yǔ)句
$stmt = $pdo -> prepare("select id, name, sex,age,email from User order by id");
$stmt ->execute();
$data = $stmt -> fetchAll(PDO::FETCH_ASSOC);
//這是從數(shù)據(jù)庫(kù)獲取的動(dòng)態(tài)數(shù)據(jù),需要在模板中顯示
$tpl->assign('title',"自定義模板引擎");$tpl->assign('auto',"小火柴");
$tpl->assign('users',$data);
$tpl -> display("main.tpl");
?>
在上面的PHP腳本文件中,通過(guò)PDO對(duì)象連接MySQL服務(wù)器,并獲取用戶表User中的全部記錄,并以PHP的二維數(shù)組變量形式保存在變量data中。接著使用包含進(jìn)來(lái)的當(dāng)前目錄下的“mytplclss.php”文件,創(chuàng)建并初始化模板引擎類的對(duì)象data中。接著使用包含進(jìn)來(lái)的當(dāng)前目錄下的“mytplclss.php”文件,創(chuàng)建并初始化模板引擎類的對(duì)象tpl。再通過(guò)該對(duì)象中的assign()方法向模板分配一些數(shù)據(jù),然后使用該對(duì)象中的display()方法載入模板文件main.tpl。并將模板中標(biāo)記的特殊變量替換為從PHP中分配的動(dòng)態(tài)數(shù)據(jù),處理完畢以后輸出模板頁(yè)面。頁(yè)面的輸出結(jié)果如下所示
限于各種不同的條件限制,比如時(shí)間、經(jīng)驗(yàn),做一個(gè)自定義的PHP模板引擎是非常困難的。其實(shí),需要的并不是重新構(gòu)造一個(gè)PHP模板,而是選擇一個(gè)最貼近自己的PHP模板加以改造

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- 需要使用php模板的朋友必看的很多個(gè)頂級(jí)PHP模板引擎比較分析
- PHP原生模板引擎 最簡(jiǎn)單的模板引擎
- PHP中MVC模式的模板引擎開發(fā)經(jīng)驗(yàn)分享
- php模板引擎技術(shù)簡(jiǎn)單實(shí)現(xiàn)
- Pain 全世界最小最簡(jiǎn)單的PHP模板引擎 (普通版)
- CodeIgniter使用phpcms模板引擎
- php smarty模板引擎的6個(gè)小技巧
- 簡(jiǎn)單的自定義php模板引擎
- 自定義min版smarty模板引擎MinSmarty.class.php文件及用法
- PHP實(shí)現(xiàn)簡(jiǎn)單的模板引擎功能示例
相關(guān)文章
PHP mysql與mysqli事務(wù)使用說(shuō)明 分享
首先, mysqli 連接是永久連接,而mysql是非永久連接。什么意思呢? mysql連接每當(dāng)?shù)诙问褂玫臅r(shí)候,都會(huì)重新打開一個(gè)新的進(jìn)程,而mysqli則只使用同一個(gè)進(jìn)程,這樣可以很大程度的減輕服務(wù)器端壓力2013-08-08
php簡(jiǎn)單統(tǒng)計(jì)字符串單詞數(shù)量的方法
這篇文章主要介紹了php簡(jiǎn)單統(tǒng)計(jì)字符串單詞數(shù)量的方法,涉及php字符串分割與數(shù)組統(tǒng)計(jì)的相關(guān)技巧,需要的朋友可以參考下2015-06-06
php基于數(shù)組函數(shù)實(shí)現(xiàn)關(guān)聯(lián)表的編輯操作示例
這篇文章主要介紹了php基于數(shù)組函數(shù)實(shí)現(xiàn)關(guān)聯(lián)表的編輯操作,涉及php數(shù)組比較函數(shù)array_intersect與array_diff的相關(guān)使用技巧,需要的朋友可以參考下2017-07-07
PHP文字轉(zhuǎn)圖片功能原理與實(shí)現(xiàn)方法分析
這篇文章主要介紹了PHP文字轉(zhuǎn)圖片功能原理與實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了php基于gd2擴(kuò)展庫(kù)生成圖片的相關(guān)配置及使用方法,需要的朋友可以參考下2017-08-08
PHPer 需要了解的 5 個(gè) Composer 小技巧
本文介紹使用Composer的五個(gè)小技巧,希望能給你的PHP開發(fā)帶來(lái)方便。2014-08-08
php調(diào)用mysql數(shù)據(jù) dbclass類
php調(diào)用mysql數(shù)據(jù)數(shù)據(jù)庫(kù)操作類,dbclass類,需要的朋友可以參考下。2011-05-05

