国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 後端開發(fā) php教程 PHP模板引擎SMARTY_PHP教程

PHP模板引擎SMARTY_PHP教程

Jul 21, 2016 pm 04:11 PM
mvc php smarty 實(shí)現(xiàn) 開發(fā) 引擎 模式 範(fàn)本 表示 邏輯


用PHP實(shí)作MVC開發(fā)模式的邏輯層和表示層有多種模板引擎可供選擇, 但官方引擎SMARTY誕生後,選擇就有了變化。它的理念和實(shí)現(xiàn)都是 相當(dāng)"前衛(wèi)"的。本文主要討論SMARTY之於其他模板引擎的不同特點(diǎn), 簡(jiǎn)要介紹了該引擎的安裝及使用,並用一個(gè)小的測(cè)試案例對(duì)比了 SMARTY和PHPLIB template的速度和易用性。

一、MVC需要模板
MVC最早是在SmallTalk語言的開發(fā)過程中總結(jié)出的一種設(shè)計(jì)模式,MVC分別代表了"模型"、"視圖"和"控制",目的就是讓不同的開發(fā)角色在大中型專案中各司其職。在網(wǎng)路應(yīng)用程式的開發(fā)中,可以用下圖來表示各概念之間的關(guān)係。


該圖展示了一個(gè)簡(jiǎn)單的WEB應(yīng)用程序,用戶在瀏覽器上看到資訊是資料庫服務(wù) 器上的內(nèi)容,但在這之前經(jīng)過了應(yīng)用伺服器加工。開發(fā)人員負(fù)責(zé)的就是建立數(shù) 據(jù)結(jié)構(gòu)、處理資料的邏輯、表示資料的方法。

96年CGI在中國(guó)開始流行的時(shí)候,早期的WEB程式設(shè)計(jì)師都是從HTML開始自學(xué)成材的,在PERL中print一行行的HTML並不是一件難事,但是隨著網(wǎng)路的一步步提速,頁面大小也從當(dāng)初的二、三十K暴漲了十倍。寫CGI程式就產(chǎn)生了一個(gè)迫切的要求:分開PERL和HTML源碼。於是,社會(huì)進(jìn)步體現(xiàn)在開發(fā)小組內(nèi)部的分工 上。由於美工和程式設(shè)計(jì)師對(duì)互相的工作並不是十分熟悉,在進(jìn)行合作的過程中需 要用一種約定的"語言"進(jìn)行交流。

這種語言並不是我們的母語或英語,術(shù)語叫做"模板",邏輯和表示依靠它聯(lián) 系。它是結(jié)合了HTML和腳本語言特徵的一種表達(dá)方式。透過這種方式,表示層 可以按照使用者所希望的格式來顯示經(jīng)過邏輯層處理過的資料。如果你有 Windows平臺(tái)下MFC的開發(fā)經(jīng)驗(yàn),那麼一定會(huì)很熟悉Document/Document Template/View的封裝,這就是一個(gè)很典型的MVC例子。對(duì)於Web應(yīng)用來說,個(gè) 人認(rèn)為J2EE中的EJB/servlets/JSP是最強(qiáng)大的,當(dāng)然還有簡(jiǎn)潔優(yōu)美的Structs。 另一個(gè)很有名的實(shí)作就是COM/DCOM ASP,這個(gè)組合在我國(guó)是最多人使用 的。

透過幾種MVC實(shí)現(xiàn)在WEB應(yīng)用程式裡的對(duì)比,可以得到一個(gè)關(guān)於模板的概念: 一組插入了HTML的腳本或者說是插入了腳本HTML,透過這種插入的內(nèi)容來表示變化的數(shù)據(jù)。下面給一個(gè)範(fàn)本檔案的例子,這個(gè)範(fàn)本經(jīng)過處理後在瀏覽器裡顯示"Hello, world!"

引言:
-------------- -------------------------------------------------- ----------------




$greetings


$greetings




-------------- -------------------------------------------------- ----------------



這裡暫且省略處理方式,在後面做專門對(duì)比討論。

二、為什麼選SMARTY?
對(duì)PHP來說,有很多模板引擎可供選擇,比如最早的PHPLIB template和後起之 秀Fast template,經(jīng)過數(shù)次升級(jí),已經(jīng)相當(dāng)成熟穩(wěn)定。如果你對(duì)目前手中的模 板引擎很滿意,那麼......也請(qǐng)往下看,相信你作為一個(gè)自由軟體愛好者或追求 效率和優(yōu)雅的開發(fā)者,下面的SMARTY介紹多少會(huì)有點(diǎn)意思。

除了個(gè)人偏好的影響,我一直傾向於使用官方標(biāo)準(zhǔn)的實(shí)現(xiàn),例如APACHE的XML 引擎Axis。好處就是可以獲得盡可能好的相容性(例如早期MFC對(duì)於Win3x的兼 容性就比其它的應(yīng)用程式框架好,當(dāng)然現(xiàn)在各種版本都很完善了)。 SMARTY發(fā) 布之前我一直使用的是PEAR 中的Integrated Template eXtension。這個(gè)引擎和PHPLIB template、Fast template幾乎是相容的,從模板的語法到對(duì)模板的處理同出一轍:都是將模板讀入內(nèi)存然後調(diào)用parse()函數(shù),用數(shù)據(jù)對(duì)預(yù)置的標(biāo)記進(jìn)行替換。

下面來看看SMARTY是怎麼做的。接到request後,先判斷是否第一次請(qǐng)求該url, 如果是,將該url所需的模板檔案"編譯"成php腳本,然後redirect;如果不是, 就是說該url的模板已經(jīng)被"編譯"過了,檢查不需要重編譯後可以馬上redirect, 重編譯條件可以自己設(shè)定為固定時(shí)限,預(yù)設(shè)的是模板檔被修改。

怎麼樣,看起來是不是有點(diǎn)眼熟?想起來了--這不就是JSP的原理嘛!的確, 這種"編譯"用在PHP這樣的解釋性腳本引擎上顯得匪夷所思,但是仔細(xì)想 想,JAVA不也是由JVM解釋執(zhí)行的嗎?這就叫"沒有做不到,只有想不到"。

既然談到了JAVA,就再對(duì)PHP的未來發(fā)表一點(diǎn)看法。 PHP官方網(wǎng)站上宣布了要在2003年年底發(fā)布PHP5.0版。這個(gè)版本擁有許多嶄新的特性:例如異常處理, 命名空間,更加面向?qū)ο竦鹊?。可以說越來越向JAVA靠攏,SMARTY也是新特 性之一,使得PHP更適用於大中型專案的開發(fā)。但似乎離我當(dāng)初選擇它的原 因──靈巧易用──越來越遠(yuǎn)了。但就一個(gè)軟體的生存週期來看,PHP正處於 成長(zhǎng)期,開發(fā)者賦予它更多的功能,以期能勝任商業(yè)應(yīng)用是利大於弊的。身為 PHP的忠實(shí)用戶,肯定不希望PHP總是被指責(zé)"能力不足"吧?

為什麼選擇SMARTY,只因?yàn)樗芟馢SP?當(dāng)然有更為充分的理由。首先,除了第一次編譯的成本比較高之外,只要不修改模板文件,編譯好的cache腳本就隨時(shí)可用,省去了大量的parse()時(shí)間;其次SMARTY像PHP一樣有豐富的函數(shù)庫,從統(tǒng)計(jì)字?jǐn)?shù)到自動(dòng)縮排、文字環(huán)繞以及正規(guī)表示式都可以直接使用;如果覺得不夠,例如需要資料結(jié)果集分頁顯示的功能,SMARTY還有很強(qiáng)的擴(kuò)展能力,可以透過插件的形式進(jìn)行擴(kuò)充。

事實(shí)勝於雄辯。我設(shè)計(jì)了一個(gè)測(cè)試程序,透過速度和開發(fā)難度這兩個(gè)因素對(duì)比了一下SMARTY和PHPLIB template,選PHPLIB template的原因是在patrick的文章《在PHP世界中選擇最合適的模板》中有一個(gè)PHPLIB template對(duì)Fast template 的競(jìng)賽,結(jié)果PHPLIB template大獲全勝,這使得SMARTY有了一個(gè)很好的對(duì)手。在測(cè)試之前,先談?wù)勗诎惭b過程中需要注意的問題。

三、可能遇到的問題
在SMARTY的官方網(wǎng)站上,有詳盡的使用手冊(cè),可以選擇線上HTML和PDF格式 的版本。這裡就不再涉及手冊(cè)上已有的內(nèi)容,只是把初次使用可能遇到的問題 做個(gè)解釋。

第一個(gè)問題就很要命:提示說找不到所需文件?並不是每一個(gè)人都按照 SMARTY預(yù)設(shè)目錄結(jié)構(gòu)來寫應(yīng)用的。這裡要手動(dòng)指定,假設(shè)目錄結(jié)構(gòu)如下:


需要在index.php裡指定目錄結(jié)構(gòu):
引言:
------------ -------------------------------------------------- ------------------

$smart->template_dir = "smarty/templates/";
$smart->compile_dir = "smarty/templates_c /";
$smart->config_dir = "smarty/configs/";
$smart->cache_dir = "smarty/cache/";


------ -------------------------------------------------- ------------------------



第一個(gè)問題解決了,緊接著是第二個(gè):我剛用Dreamweaver產(chǎn)生的漂亮模板怎麼不能用?並不是模板檔案有什麼問題,而是因?yàn)镾MARTY預(yù)設(shè)的標(biāo)記分隔 符號(hào)是{},不巧的是Javascript肯定包含這個(gè)標(biāo)記。還好我們可以用任意字元當(dāng)作分隔符,再加上這兩句話:
引言:
----------------------- -------------------------------------------------- -------


$smart->left_delimiter = "{/";
$smart->right_delimiter = "/}";


-------------------------------------------------- ------------------------------



這下安裝就基本完成,沒問題了。

四、反襯和類比
先構(gòu)思一下對(duì)測(cè)試的設(shè)計(jì)。主要的評(píng)比因素當(dāng)然是速度了。為了進(jìn)行速度測(cè) 試,採(cǎi)取了算術(shù)平均數(shù)的作法。在測(cè)試頁面中重複將頁面產(chǎn)生N遍,再比較總頁 面產(chǎn)生時(shí)間。另一個(gè)重要因素是易用性(至於擴(kuò)展性不用比較已經(jīng)有結(jié)果了),所 以使用的模板不能太小。我用的是個(gè)人首頁的的頁面,一個(gè)用 Firework Dreamweaver產(chǎn)生的HTML文件,大小約7K。其中的變數(shù)設(shè)定也採(cǎi)取 最常用的區(qū)塊,在PHPLIB template裡叫block,而SMARTY則稱section。別小看 這稱呼的不同,易用性標(biāo)準(zhǔn)分成兩塊:範(fàn)本文件和腳本文件的語法是否簡(jiǎn)明易 用。


下面就深入到測(cè)試中來。先看看兩種模板檔案的語法:藍(lán)條左邊是PHPLIB template的模板,右邊屬於SMARTY。個(gè)人偏好是不一樣的,所以這裡不作評(píng) 論。著重比較一下腳本裡的處理語句,先看PHPLIB template的:
引言:
--------------------------- -------------------------------------------------- ---


$tpl->set_file('phplib', 'bigfile.htm');
$tpl->set_block('phplib', 'row', 'rows') ;
for ($j = 0; $j $tpl->set_var('tag' ,"$j");
$tpl->parse('rows ', 'row', true);
}
$tpl->parse('out', 'phplib');
$tpl->p('out');


---------------------------------------------- ----------------------------------


下面是SMARTY的:

引言:
----------------------------------------- ---------------------------------------

$smart->assign ('row',$row);
$smart->display('bigfile.htm');

------------------- -------------------------------------------------- -----------



SMARTY只用了tags和row兩個(gè)變量,而PHPLIB template則多了模板文件的handler,還有一個(gè)莫名其妙的out。說實(shí)在的這個(gè)out我當(dāng)初學(xué)的時(shí)候就不知道 為什麼要存在,現(xiàn)在看起來,還是彆扭。為什麼SMARTY少那麼多處理語句 呢?答案是工作由引擎完成了。如果你喜歡鑽研原始程序,你可以發(fā)現(xiàn)在 Smarty_compiler.class.php裡有一個(gè)名叫_compile_tag()的函數(shù),由它負(fù)責(zé)把 section這個(gè)標(biāo)籤轉(zhuǎn)換成php語句。這不是一個(gè)普通的標(biāo)籤,它帶有參數(shù)和數(shù) 據(jù),節(jié)省了腳本編程的工作量,而模板標(biāo)籤上的工作量相差又不大,可以判定 在易用性上SMARTY高出一疇。

下面該輪到我們最關(guān)注的速度了,畢竟對(duì)於一個(gè)熟練的web開發(fā)者來說,掌握再 困難的工具不過是時(shí)間問題,何況模板引擎這種學(xué)習(xí)曲線平緩的技術(shù)。而速度 則是web應(yīng)用程式的生命,尤其是模板引擎使用在並發(fā)訪問量很大的網(wǎng)站上,這 點(diǎn)就更重要了。測(cè)試開始前,我覺得PHPLIB template會(huì)在這一環(huán)節(jié)上勝出,因 為它經(jīng)歷了很多次升級(jí),已經(jīng)基本沒有什麼bug,而且SMARTY的引擎?zhèn)€頭太 大,不像它的對(duì)手只有兩個(gè)文件。

果然,測(cè)試結(jié)果如下圖,PHPLIB template有25%的速度優(yōu)勢(shì):


但不會(huì)一直這樣,我又按了一次刷新,這次得到了不一樣的結(jié)果:


PHPLIB基本上沒變化,但是SMARTY提高了25%的速度。繼續(xù)刷新,得到的都是 類似第二次的結(jié)果:SMARTY比PHPLIB template 快上近10%。我想這就是編 譯型比解釋型快的原理了。 SMARTY引擎本身就很大,加上還要把模板編譯成 php文件,速度當(dāng)然比不上小巧的PHPLIB template。但這只是第一次的情況。 第二次接到請(qǐng)求的時(shí)候,SMARTY發(fā)現(xiàn)該模板已經(jīng)被編譯過了,於是最耗時(shí)的 一步被跳過了,而對(duì)手還要按部就班地進(jìn)行查找和替換工作。這是編譯原理裡 講到的很經(jīng)典的"用空間換時(shí)間"例子。

五、結(jié)論
結(jié)論就是如果你已經(jīng)愛上SMARTY了,那還等什麼呢?當(dāng)然不是說它就全 能,就如同我用MVC模式來寫我的個(gè)人網(wǎng)站,非但沒有減少工作量,反而總是 要為不同層次間的耦合勞神。

SMARTY不適合什麼呢?舉個(gè)手冊(cè)裡的經(jīng)典例子:天氣預(yù)報(bào)網(wǎng)站。我還想到一 個(gè):股市大盤。在這種網(wǎng)站上用SMARTY會(huì)因?yàn)榻?jīng)常的重編譯而效率偏低,還 是PHPLIB template比較為適合。

本文不是為了比較兩款引擎,而是為了說明SMARTY的優(yōu)勢(shì)。使用它最有意 義之處在於它是PHP新體系的一部分,作為一支獨(dú)立的力量,除了.NET和JAVA ONE這兩大體系之外,大中型web開發(fā)還有別的選擇。這對(duì)GNU專案來說, 其意義無異於劉鄧大軍千里躍進(jìn)大別山。

參考文獻(xiàn)

SMARTY官方網(wǎng)站:smarty.php.net
王晨:《在PHP世界中選擇最合適的模板》
本文中測(cè)試程式下載:test .tar.bz2
http://phpe.net/uploads/attach/article_1058233528.bz2
About the author
於博翔,筆名於萊來自對(duì)外經(jīng)濟(jì)貿(mào)易大學(xué)資訊學(xué)院。 GNU癡迷者,喜歡練習(xí)各種程式設(shè)計(jì) 言,研究各種體系框架。

發(fā)文數(shù):1275 回覆:與許多的PHP script 都將使用Smarty為核心引擎,而Smarty到底是什麼? 2003-08-10 14:07

在PHP世界中選擇最適合的模板--比較PHPLIB Template和FastTemplate



PHP工程中的模板應(yīng)用,是進(jìn)行中型乃至大型專案中建議採(cǎi)用的處理表現(xiàn)層的好辦法。但 是具體到模板的實(shí)施,採(cǎi)用何種現(xiàn)有的模板技術(shù)卻需要進(jìn)行一番比較。

PHP世界中比較受關(guān)注的模板處理有PHPLIB Template和FastTemplate兩種,我們對(duì)技術(shù)的易用性和速 度進(jìn)行了評(píng)測(cè)--想知道結(jié)果嗎?

事情的起因:你用過FastTemplate嗎?
對(duì)於PHP工程中的模板應(yīng)用,其實(shí)我和我的同事們已經(jīng)在許多的項(xiàng)目中接觸過--關(guān)於它的好處,我想無論是在實(shí)際開發(fā)階段還是上升到設(shè)計(jì)模式的角度都已經(jīng)有很多"前輩先哲"討論過了。就專案實(shí)施而言,在一些中型甚至大型的專案中,有效的將HTML(還有其他文字形式的表現(xiàn)層)和PHP程式碼分開,不僅在開發(fā)階段可以分別提高介面設(shè)計(jì)人員和應(yīng)用程式編寫人員的工作效率,更會(huì)為專案的測(cè)試和維護(hù)帶來巨大的便利。

但是--本文的目的不是討論模板的優(yōu)缺點(diǎn),也不是作為指導(dǎo)性的教程講授如何在PHP項(xiàng)目中使用模板,而是以應(yīng)用的視角比較兩種PHP世界中最為流行的模板處理方式(其實(shí)只不過是兩種模板類別):PHPLIB Template和FastTemplate。

其實(shí)我一直都在"安靜"的使用著PHPLIB Template--很穩(wěn)定而且看上去速度也不錯(cuò),以至於我並不想再去不安的尋找可能更好的替代品--雖然我也知道這個(gè)地球上還有FastTemplate這樣的東西(而且還在Perl的世界中大名鼎鼎)。直到有一天,有同事問我:"不知道FastTemplate怎麼樣?為什麼我們不試試FastTemplate呢?"

"好吧,就讓我們?cè)囋?!」不過作為一個(gè)穩(wěn)健的方法,在任何新的模式或方法引入專案之前,最好能夠更加全面的了解它,以及找到一個(gè)或幾個(gè)足夠說服自己和同事去採(cǎi)用它的理由--對(duì)於FastTemplate也不例外。

主角出場(chǎng):了解PHPLIB Template以及FastTemplate
前面已經(jīng)說過,我已經(jīng)使用PHPLIB有一段時(shí)間了--我想屏幕前的你也許和我一樣,也對(duì)這個(gè)優(yōu)秀的工具類庫印像很深吧!同樣,當(dāng)我開始尋求範(fàn)本的解決方案時(shí),很自然的就會(huì)在最接近身邊的工具箱裡搜尋,於 是我找到了PHPLIB中的Template類別。在最初的很快瀏覽完它提供的API之後(當(dāng)然還得感謝PHPLIB詳盡 的文檔),我就開始了使用它的歷程--直到現(xiàn)在。

而FastTemplate似乎名氣更響亮一些,在其發(fā)蹟?shù)腜erl世界中自然是這樣,在PHP世界中似乎也是,單單 從這一點(diǎn)上就足夠讓人相信它的能力了。

關(guān)於兩者的使用辦法,本來我想在這裡多廢話幾句的;但是畢竟覺得自己恐怕專門寫出兩篇教程來也沒有現(xiàn)有的教程受歡迎--在本文的參考資料中有關(guān)於PHPLIB Template和FastTemplate的有名教程,如果你自認(rèn)還沒有對(duì)這兩種模板或者其中的一種有所認(rèn)識(shí),建議你先去看看那兩篇文章,應(yīng)該會(huì)得到不少有益的模板應(yīng)用知識(shí)。

(一番滑鼠點(diǎn)擊以及眼球轉(zhuǎn)動(dòng)甚至親自編寫測(cè)試程式碼之後,)現(xiàn)在你對(duì)兩種模板都有了一些了解,也許已經(jīng)發(fā)現(xiàn)了它們之間的很多相似之處,在下面我就會(huì)將這些地方歸納。

變數(shù)的設(shè)定
很明顯,{FOO}或{BAR}的形式在兩種範(fàn)本中都是指定的形式;也就是說,兩種範(fàn)本處理方式中,範(fàn)本檔案本身的外貌應(yīng)該可以是一致的(例如都是HTML檔案中間含有將要被替換的以{}標(biāo)識(shí)的變數(shù))。
模板類別的初始化(類別的建構(gòu)器)
都需要在建構(gòu)模板類別的時(shí)候指定模板檔案存在的目錄位置。
變數(shù)的替換
模板處理中最常用的就是變數(shù)替換,兩種方式除了方法名稱不同之外(PHPLIB Template採(cǎi)用set_var(),而FastTemplate採(cǎi)用assign()),用法幾乎也是一致的- -可以採(cǎi)用(key, 值)的方式, 也可以直接傳遞一個(gè)陣列(array(key=>value))。
範(fàn)本檔案的處理
都是採(cǎi)用為每一個(gè)範(fàn)本檔案指定一個(gè)句柄(handler)的辦法,同時(shí)句柄也可以作為變數(shù)的值來取代 另一個(gè)範(fàn)本檔案中的變數(shù)。
解析、輸出過程
都是需要呼叫parse()方法(這個(gè)方法名稱竟然是相同的)將需要輸出的模板檔案解析後賦值給一個(gè)句柄,然後呼叫各自輸出的方法(PHPLIB Template中是p(),F(xiàn)astTemplate中是FastPrint())輸出該句柄的內(nèi)容並結(jié)束處理。
重複解析的過程
例如從資料庫中取出幾筆記錄需要顯示而模板檔案只有可替換的一行變數(shù)的時(shí)候,就很需要這樣的 功能。兩者都具有這樣的功能,只是使用時(shí)稍稍有些不同而已(PHPLIB Template採(cǎi)用parse(handler, value, true),而FastTemplate採(cǎi)用parse(handler, .value)在值的前面多加一個(gè)點(diǎn)),應(yīng)該說PHPLIB Template的方法構(gòu)造得相對(duì)優(yōu)美一點(diǎn)。
區(qū)塊解析的過程(或可以稱作動(dòng)態(tài)解析)
想像一下你需要從資料庫中取出符合條件的資料並顯示在網(wǎng)頁中--但是因?yàn)闂l件會(huì)不盡相同,你並不能明確的知道會(huì)有多少條數(shù)據(jù)--這時(shí)候如果你又要採(cǎi)用模板,那麼區(qū)塊就是最好的選擇。它是在 模板中用特定的符號(hào)定義的部分,這一部分可以重複的被解析並添加到(而不是前一次的解析被後 一次覆蓋)輸出網(wǎng)頁中。區(qū)塊也許就像下面顯示的一樣(左邊是PHPLIB Template採(cǎi)用的區(qū)塊設(shè)置,而右邊則是FastTemplate採(cǎi)用的):



好吧,如果你對(duì)以上蒼白的文字介紹還是有些摸不著頭腦,那麼我們就來看看兩個(gè)詳盡的模板處理的例程吧! (如果你有興趣對(duì)後面的測(cè)試程式碼進(jìn)行發(fā)掘,你會(huì)發(fā)現(xiàn)其實(shí)以下的兩個(gè)例子都來自那裡)


怎麼樣,是不是感覺幾乎是一致的?以下是區(qū)塊解析的例子,你也會(huì)發(fā)現(xiàn)同樣的效果:


我們的測(cè)試目標(biāo)和結(jié)果
結(jié)束了對(duì)PHPLIB Template和FastTemplate的了解,應(yīng)該可以進(jìn)入本文的正題了--在應(yīng)用環(huán)境中當(dāng)然應(yīng)該選擇易於使用同時(shí)速度理想的部件構(gòu)建系統(tǒng),那麼對(duì)於這樣的兩種類似技術(shù),進(jìn)行評(píng)測(cè)非常有必要。評(píng)測(cè) 應(yīng)該是由兩部分組成:技術(shù)的使用難度和速度的快慢程度--前者是評(píng)論的部分,而後者是測(cè)試的部分。對(duì) 於前者,我們主要針對(duì)兩個(gè)類別提供的API進(jìn)行評(píng)論;對(duì)於後者,我們會(huì)讓測(cè)試的資料來說話,當(dāng)然這中間 免不了需要編寫一些簡(jiǎn)單的測(cè)試程式碼。

回合一:技術(shù)的易用性
這一回合主要是探討PHPLIB Template和FastTemplate提供的API的使用情況。應(yīng)該說,前者提供的API 更符合PHP的一些常見編碼慣例(特別是當(dāng)你的專案中採(cǎi)用了PHPLIB的其他類別時(shí),這樣的規(guī)範(fàn)性會(huì)對(duì)整個(gè)專案有好的影響);而後者的一些方法名總覺得有些彆扭(希望你不要覺得這只是我的狹隘看法,比如FastPrint()等等),同時(shí)方法的參數(shù)也不是非常"地道",這一點(diǎn)你也可以從剛才的程式碼看出來。

另外一點(diǎn)要指出的是,對(duì)於模板區(qū)塊的解析,F(xiàn)astTemplate直到最近的版本才開始支援。也就是說,如果你採(cǎi)用了之前的版本,在處理諸如數(shù)據(jù)庫中記錄的輸出等內(nèi)容時(shí),不得不把這塊內(nèi)容獨(dú)立存儲(chǔ)在某處, 然後在模板分析處理時(shí)附加上這個(gè)文件--真是一件讓人難受的事情,尤其是對(duì)網(wǎng)頁設(shè)計(jì)師而言。

當(dāng)然還有一點(diǎn)要考察--那就是對(duì)於PHP版本的支援。 PHPLIB產(chǎn)生在PHP3的時(shí)代,這和FastTemplate差不多;但是根據(jù)我們的應(yīng)用,PHPLIB在現(xiàn)在的PHP4環(huán)境下運(yùn)行相當(dāng)好,而FastTemplate的網(wǎng)頁上則顯示了一些資訊表明對(duì)於PHP4也許它還有一些BUG存在。

好了,講了這麼多(也許你會(huì)覺得都是FastTemplate的壞話),這個(gè)回合的勝利者很明顯:PHPLIB Template,尤其是你同時(shí)在使用PHPLIB的其他類時(shí),這樣的技術(shù)易用性更加明顯(你將不會(huì)對(duì)這些出自同一個(gè)開發(fā)小組的API感到陌生)。

回合二:處理速度
也許這才是很多人最關(guān)注的部分--在這個(gè)回合中,我們會(huì)採(cǎi)用兩種模板處理的方式:一種是常規(guī)的分析、 替換,另一種是對(duì)區(qū)塊的解析、替換--同時(shí)這樣的兩種方式也是在實(shí)際系統(tǒng)中應(yīng)用最多的:前者是一般的頁面處理,後者是關(guān)於資料庫內(nèi)容的輸出處理。同時(shí),由於兩種範(fàn)本類別所採(cǎi)用的範(fàn)本檔案的格式基本上相同, 使得我們可以提供幾乎一致的範(fàn)本檔案分別供兩種範(fàn)本解析,更增加了測(cè)驗(yàn)的可信度。

進(jìn)行這樣的速度測(cè)試之前會(huì)擬定一個(gè)測(cè)試方案,簡(jiǎn)單說來就是對(duì)於兩種處理方式分別編寫兩個(gè)PHP測(cè)試頁面,同時(shí)有一個(gè)控制測(cè)試的頁面多次調(diào)用這兩個(gè)頁面並記錄時(shí)間供採(cǎi)集測(cè)試數(shù)據(jù)。 (如果有興趣你也可以參考以下詳細(xì)的測(cè)試方案,也許會(huì)對(duì)你深入了解這次測(cè)試有所幫助)

小結(jié)--在整個(gè)測(cè)試系統(tǒng)完成之後,我們應(yīng)該能夠得到/test目錄中如下的文件清單:

(有點(diǎn)複雜的測(cè)試方案)

首先是確定測(cè)試的硬體和軟體環(huán)境--硬體肯定是自己的機(jī)器了,Intel Celeron 733MHz, 256M RAM ,40G HDD;軟體平臺(tái)中OS為Win2K Pro,Web伺服器為Apache PHP,且以模組方式運(yùn)作。

其次是規(guī)劃這次測(cè)試的系統(tǒng)--當(dāng)然先在Web伺服器的文檔根目錄下開一個(gè)tpl_test的新目錄用以放置這個(gè)測(cè)試的??所有文件;然後在/tpl_test下建立include目錄以存放兩個(gè)模板類別檔案(我們測(cè)試的核心,以.inc.php為檔案副檔名)以及一個(gè)測(cè)試類別檔案(包括了計(jì)時(shí)和記錄日誌以及讀取日誌並分析等功能,以.inc.php為文件擴(kuò)展名)和一個(gè)資料檔案(為區(qū)塊解析的測(cè)試做準(zhǔn)備,主要包含了一個(gè)二維數(shù)組,同樣以.inc.php為檔案副檔名),建立ihtml目錄存放使用的模板檔案(需要解析的範(fàn)本文件,以.ihtml為文件副檔名),建立logs目錄存放測(cè)試產(chǎn)生的日誌(後面就是發(fā)現(xiàn),其實(shí)測(cè)試的資料就是由對(duì)這些日誌的分析得到的,以.log為文件副檔名)。當(dāng)然,兩種模板的處理PHP檔案就放在/test目錄下。這次測(cè)試最關(guān)鍵的一點(diǎn)是, 還要建立一個(gè)PHP文件,對(duì)以上提到的負(fù)責(zé)模板處理的文件進(jìn)行幾次呼叫:例如一個(gè)文件fast_test.php是採(cǎi)用FastTemplate解析模板的,而phplib_test.php是採(cǎi)用PHPLIB Template 解析的,那麼這個(gè)得出結(jié)果的PHP檔案就負(fù)責(zé)多次以HTTP的方式請(qǐng)求以上的兩個(gè)頁面以獲得測(cè)試資料。

選擇待解析的模板和PHP程式編寫--因?yàn)閮煞N模板處理方式對(duì)於模板檔案本身的格式要求幾乎一致(例如待替換變數(shù)都採(cǎi)用{VAR}的形式等等),因此可以盡量確保同一測(cè)試中兩者選用的模板盡可能相同以謀求測(cè)試的最大公正性;同時(shí)在前文提到,為模擬現(xiàn)實(shí)係統(tǒng)中常用的兩種模板應(yīng)用:一般的頁面處理和對(duì)數(shù)據(jù)庫內(nèi)容的輸出處理,測(cè)試使用的模板文件也分成兩種:一種是普通的帶有一些待替換變量的模板文件,另一種是帶有區(qū)塊的需要根據(jù)應(yīng)輸出的內(nèi)容反復(fù)替換的模板文件。同樣對(duì)於這兩種模板文件,也需要分別編寫兩種不同的PHP文件 來解析。

測(cè)試方法--在瀏覽器中向/test/result.php提出請(qǐng)求,需要帶參數(shù)type=[simple|complex],在返回的結(jié)果中即可看到兩種模板在簡(jiǎn)單或者複雜模式下的測(cè)試結(jié)果。

Level 1
Level 2
Level 3
Remark

/test


測(cè)試系統(tǒng)的根目錄


測(cè)試系統(tǒng)的根目錄







result.php

進(jìn)行測(cè)試並產(chǎn)生結(jié)果的PHP文件,測(cè)試時(shí)只需要在瀏覽器中請(qǐng)求該頁面即可獲得測(cè)試資訊


simple__test_phplib.php

使用PHPLIB Template對(duì)一般模板進(jìn)行分析的PHP檔案


simple__test_fast.php


simple__test_fast.php

complex__test_phplib.php

使用PHPLIB Template對(duì)帶區(qū)塊模板進(jìn)行分析的PHP檔案

.php

使用FastTemplate分析有區(qū)塊模板的PHP檔案







/include



/include



/include
包含PHP類別檔案.inc.php



phplibTemplate.inc.php
PHPLIB Template類別檔案


FastTemplate??>

FastTemplate??>

FastTemplate??>

FastTemplate. php
FastTemplate類文件



TplTest.inc.php
測(cè)試中需要使用的測(cè)試類,包含諸如計(jì)時(shí)、讀取/分析日誌等方法。



data.inc.php
測(cè)試有區(qū)塊模板時(shí)所採(cǎi)用的資料檔案。







/ihtml

包含模板檔.ihtml


.ihtml
採(cǎi)用PHPLIB Template處理的一般範(fàn)本檔案



simple_fast.ihtml
採(cǎi)用FastTemplate處理的一般範(fàn)本檔案


採(cǎi)用FastTemplate處理的一般範(fàn)本檔案



complex_phplib.ihtml
用PHPLIB Template處理的帶區(qū)塊的模板檔案



complex_fast.ihtml
採(cǎi)用FastTemplate處理的帶區(qū)塊的模板


用>





/logs

包含日誌檔案.log



simple_fphplib.採(cǎi)用PHPLIB Template處理一般範(fàn)本產(chǎn)生的日誌simple_fast.log 採(cǎi)用FastTemplate處理一般範(fàn)本產(chǎn)生的日誌com 採(cǎi)用PHPLIB Template處理帶區(qū)塊模板產(chǎn)生的日誌complex_fast.log 採(cǎi)用FastTemplate處理帶區(qū)塊模板生成的日誌經(jīng)過了測(cè)試系統(tǒng)的設(shè)計(jì)和編寫,並且向負(fù)責(zé)網(wǎng)頁設(shè)計(jì)的同事討來兩個(gè)模板之後,我們就可以訪問這個(gè)系統(tǒng)了--前期的辛勤勞動(dòng)使得現(xiàn)在觀看結(jié)果的工作只需要在瀏覽器的地址欄中打入http://localhost/tpl_test/ result.php?type=[simple|complex] (如果你是在其他的非本地伺服器中進(jìn)行這個(gè)測(cè)試,那麼網(wǎng)域名稱應(yīng)採(cǎi)用所在伺服器的網(wǎng)域-例如我自己的機(jī)器叫做patrick等等)。以下是我自己在某一次的測(cè)試中獲得的結(jié)果:(測(cè)試結(jié)果數(shù)據(jù)解釋)

名稱
解釋
備註

amount
測(cè)試總數(shù)(連續(xù)請(qǐng)求此頁總數(shù))
此參數(shù)可在result.php檔案中修改

max_seq
最大處理時(shí)間的序號(hào)
範(fàn)圍在1-amount之間

max_value
最大處理時(shí)間的值
峰值資料供參考

min_seq
最小處理時(shí)間的序號(hào)
範(fàn)圍在1-amount之間

min_value
最小處理時(shí)間的值
峰值資料供參考

average
平均處理時(shí)間
測(cè)試中最有價(jià)值的數(shù)據(jù)


當(dāng)然,如果你覺得一次測(cè)試的結(jié)果並不可靠,可以重複按下瀏覽器的刷新按鈕,就能夠觀察到不同測(cè)試的

結(jié)果(理論上應(yīng)該是相差無幾)。

測(cè)試結(jié)果以及頒發(fā)"XX選擇獎(jiǎng)"
好了,在偏重速度測(cè)試的回合二中PHPLIB Template以驚人的2倍的速度戰(zhàn)勝了FastTemplate;而同時(shí)在第一回合中PHPLIB Template有以良好的API設(shè)計(jì)和易用性佔(zhàn)上風(fēng)。結(jié)果顯而易見--我們的選擇獎(jiǎng)當(dāng)然頒 發(fā)給了PHPLIB Template,同時(shí)這次的測(cè)試也讓我們對(duì)PHPLIB這個(gè)類別庫設(shè)計(jì)有了更深的了解。

主觀評(píng)價(jià)
既然有了結(jié)果,那麼FastTemplate自然也就不能進(jìn)入我們的專案了--雖然從結(jié)果上看來我們花了半天的時(shí)間得到了一個(gè)毫無變化的結(jié)果( PHPLIB Template繼續(xù)很好的在專案中使用),但是測(cè)試的過程卻是很有價(jià)值的,特別是採(cǎi)用PHP進(jìn)行測(cè)試的方法,應(yīng)該會(huì)在以後的類似決策中起到一定參考作用。


www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/314004.htmlTechArticle用PHP實(shí)作MVC開發(fā)模式的邏輯層和表示層有多種模板引擎可供選擇, 但官方引擎SMARTY誕生後,選擇就有了變化。它的理念和實(shí)現(xiàn)都是 相當(dāng)...
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? 我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? 什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何將PHP代碼嵌入HTML文件中? 如何將PHP代碼嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以將PHP代碼嵌入HTML文件中,但需確保文件以.php為擴(kuò)展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)籤包裹PHP代碼,可在HTML中任意位置插入動(dòng)態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實(shí)現(xiàn)條件渲染等動(dòng)態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)籤、引號(hào)錯(cuò)誤或遺漏結(jié)束標(biāo)籤導(dǎo)致問題。

編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什麼? 編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什麼? Jun 24, 2025 am 12:53 AM

寫乾淨(jìng)、易維護(hù)的PHP代碼關(guān)鍵在於清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用註釋和可測(cè)試性。 1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免麵條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加註釋並撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測(cè)試性,採(cǎi)用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和後期維護(hù)便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

See all articles