摘要:本文在分析主流Web架構(gòu)的基礎(chǔ)上,討論了PHP開發(fā)框架涉及到的幾種主要技術(shù):MVC設(shè)計模式、模板解析引擎和數(shù)據(jù)訪問層及其在PHP中實現(xiàn)的主流方式和優(yōu)缺點,給出了基于被動MVC、模板解析技術(shù)和Table Data Gateway模式的數(shù)據(jù)訪問層來實現(xiàn)輕量級的PHP開發(fā)框架的解決方案。
關(guān)鍵詞:MVC;模板解析引擎;數(shù)據(jù)訪問層;PHP
中圖分類號:TP311.52 文獻標(biāo)識碼:A 文章編號:1007-9599 (2012) 20-0000-02
1 引言
PHP是在服務(wù)器端執(zhí)行的腳本語言,具有簡單易用、執(zhí)行效率高和跨平臺性好等優(yōu)點,是目前最受歡迎的Web開發(fā)語言之一。然而,由于PHP5之前的PHP版本對面向?qū)ο笾С植煌晟疲瑢?dǎo)致PHP的開發(fā)框架研究從PHP5發(fā)布后才逐漸展開、在發(fā)展過程中又受到Structs和ROR框架的嚴(yán)重影響,沒有充分考慮PHP語言的特點,造成在PHP領(lǐng)域,框架的普及情況遠遠不如Java領(lǐng)域。PHP框架的研究首先要解決的是采用何種Web架構(gòu)的問題:
2 Web開發(fā)架構(gòu)
簡單的說,Web開發(fā)實際上是通過將HTTP請求發(fā)送給服務(wù)器端腳本,通過服務(wù)器端腳本對數(shù)據(jù)庫進行數(shù)據(jù)管理。Web架構(gòu)即是Web系統(tǒng)中服務(wù)器腳本以及HTTP請求的組織形式。目前流行的Web架構(gòu)有以下三種:2.1 基于文件/參數(shù)。傳統(tǒng)的Web系統(tǒng)中,服務(wù)器腳本根據(jù)功能不同分別存儲在不同的目錄中。服務(wù)器腳本的路徑與URL地址相對應(yīng)。HTTP請求通過URL直接指向某個服務(wù)器腳本,并在URL后附上特定的參數(shù),以提供腳本執(zhí)行所需的數(shù)據(jù)。腳本article.php執(zhí)行完畢后將執(zhí)行結(jié)果響應(yīng)給用戶。這種是一種面向過程的開發(fā)方式,較為簡單直接。在小型的Web系統(tǒng)中應(yīng)用較廣泛。但由于在URL中附加參數(shù),因此基于文件/參數(shù)的方式不利于搜索引擎收錄,同時各文件相對獨立的處理HTTP請求,因此也難以實現(xiàn)系統(tǒng)的集中控制。2.2 基于控制器/動作。隨著面向?qū)ο蟮某墒?,Web系統(tǒng)逐漸引入基于控制器/動作的開發(fā)方式。這種方式通常使用一個路由模塊解析HTTP請求,并調(diào)用適當(dāng)?shù)目刂破鳎ɑ蚩刂破髦械哪骋粋€動作)對請求進行處理。MVC設(shè)計模式是基于控制器/動作的一種典型實現(xiàn)。與基于文件的方式一樣,基于控制器/動作的架構(gòu)也是建立在請求/響應(yīng)驅(qū)動的基礎(chǔ)上。2.3 基于組件/事件?;诮M件/時間的Web系統(tǒng)與桌面應(yīng)用程序相似,通常將Web系統(tǒng)分為多個組件,各組件可以觸發(fā)特定的事件并由事件處理器處理。這樣就可以將HTTP請求抽象后映射到事件上。.NET是典型的基于組件/事件的Web框架。其代碼重用能力很強,開發(fā)速度也很高。但這種方式往往要求完善的控件支持和強大的IDE開發(fā)環(huán)境。在缺乏這兩個條件時,其優(yōu)勢難以發(fā)揮。
3 PHP與MVC模式
3.1 在PHP中實現(xiàn)MVC的特點。MVC模式通過分離數(shù)據(jù)、邏輯和顯示,將Web系統(tǒng)中的數(shù)據(jù)處理、流程控制和數(shù)據(jù)展示強制性的分為模型、控制器和視圖三大部分。三者通過控制器結(jié)合在一起。從而從根本上避免了傳統(tǒng)的Web開發(fā)方式中存在的顯示、邏輯和數(shù)據(jù)相互纏繞的問題,使得程序結(jié)構(gòu)清晰而靈活[2]。MVC模式要求在跨頁面的腳本中實現(xiàn)模型和控制器互相通信。然而由于PHP對象在頁面執(zhí)行完畢后即被回收,因此PHP對象無法跨頁面存在,傳統(tǒng)的MVC架構(gòu)在PHP上無法完全實現(xiàn)。通常解決方案是在回收前將對象存入數(shù)據(jù)庫或SESSION中,需要時在從數(shù)據(jù)庫或SESSION中重建對象。這種方式由于需要頻繁讀寫數(shù)據(jù)庫,顯然效率較為低下?;赑HP對象無法跨頁面存在的現(xiàn)狀,在PHP框架中使用被動MVC模式更為合理。在被動MVC中,模型以普通對象的形式存在,與MVC結(jié)構(gòu)的其他部分沒有關(guān)聯(lián)。這樣既可避免對象跨頁面的問題,避免了MVC模式帶來的效率下降。3.2 視圖層。Web項目擴大帶來的眾多問題中,前端設(shè)計團隊與程序設(shè)計團隊的協(xié)作、維護和擴展難度的控制是兩大難點。分離頁面設(shè)計與程序邏輯是最有效的解決方案[3]。在PHP Web開發(fā)中,通常采用模板技術(shù)分離顯示和邏輯。對應(yīng)于MVC,模板解析引擎通常處于視圖層。模板解析引擎提供相對簡單的模板語言[4],以支持前端設(shè)計人員編寫HTML模板。模板解析引擎可以講HTML模板編譯成PHP腳本后直接運行。總的來說,PHP框架的視圖層通常采用類似Smarty的模板解析引擎驅(qū)動,以相對簡潔的模板語言或直接采用PHP語言在模板中實現(xiàn)顯示邏輯,從而實現(xiàn)業(yè)務(wù)邏輯和前端展示的分離。3.3 數(shù)據(jù)訪問層。開發(fā)框架要解決的另一個主要問題是在系統(tǒng)中將業(yè)務(wù)邏輯和數(shù)據(jù)相互分離。通常是使用數(shù)據(jù)訪問層將程序與數(shù)據(jù)庫分離。數(shù)據(jù)訪問層一般采用數(shù)據(jù)關(guān)系映射(ORM)實現(xiàn)邏輯和數(shù)據(jù)的分離。ORM使用元數(shù)據(jù)描述對象和數(shù)據(jù)庫之間的關(guān)系,并映射到數(shù)據(jù)庫中[5]。由于程序?qū)ο蠛完P(guān)系數(shù)據(jù)庫的映射較為復(fù)雜,因此會造成比較嚴(yán)重的效率降低。從PHP5開始,ORM逐漸被引入到PHP開發(fā)框架的設(shè)計中。但現(xiàn)有的PHP ORM項目雖然都基本實現(xiàn)了對象關(guān)系映射,卻普遍存在結(jié)構(gòu)復(fù)雜、效率低下的缺陷。
為降低數(shù)據(jù)訪問層的復(fù)雜性,在PHP框架設(shè)計中活動記錄模式(ActiveRecord)逐漸開始流行。ActiveRecord將每一條數(shù)據(jù)記錄都包裝為一個對象實例,這可以極大的提高數(shù)據(jù)庫相關(guān)程序的開發(fā)速度。然而,這種方式在處理關(guān)聯(lián)表時,即使只提取一條記錄,與之關(guān)聯(lián)的所有其他記錄均會被包裝為對象實例,這將會造成效率的急劇下降;對于需要頻繁更新數(shù)據(jù)的場景,由于所有的數(shù)據(jù)均需被封裝為對象,更新對象屬性后將對象存入數(shù)據(jù)庫才能完成數(shù)據(jù)更新。顯然,在數(shù)據(jù)訪問層中使用活動記錄模式的效率仍不理想。
對于輕量級的PHP框架,對數(shù)據(jù)庫的操作跟適合采用更簡化的數(shù)據(jù)庫訪問層方案。與活動記錄模式相比,表數(shù)據(jù)入口(Table Data Gateway)模式僅對數(shù)據(jù)表實現(xiàn)封裝,而不是對封裝每一個記錄行。與PHP強大的關(guān)聯(lián)數(shù)組相結(jié)合,表數(shù)據(jù)入口可以高效、靈活地操作大量數(shù)據(jù)。由于不對記錄進行封裝,因此表數(shù)據(jù)入口操作的是純數(shù)據(jù),而非封裝了數(shù)據(jù)的對象。表數(shù)據(jù)入口模式可直接對數(shù)據(jù)庫進行操作,這就決定了表數(shù)據(jù)入口模式具有很高的數(shù)據(jù)操作效率。
相對于 Active Record 模式,Table Data Gateway 模式在數(shù)據(jù)表層面上封裝數(shù)據(jù)操作,更為簡潔清晰,適合在輕量級的PHP框架中使用;由于復(fù)雜性降低,也可以大大降低用戶的學(xué)習(xí)成本;表數(shù)據(jù)入口不封裝記錄,因此可以直接操作數(shù)據(jù)庫,且表數(shù)據(jù)入口模式中的數(shù)據(jù)以數(shù)組的形式保存,利用PHP關(guān)聯(lián)數(shù)組的優(yōu)勢,執(zhí)行效率比活動記錄模式高得多。總的來說,輕量級PHP開發(fā)框架的數(shù)據(jù)訪問層使用表數(shù)據(jù)入口模式實現(xiàn),執(zhí)行效率更高、學(xué)習(xí)難度更低。
4 總結(jié)
總之,隨著PHP語言的發(fā)展,尤其是PHP5在面向?qū)ο笾С稚系木薮箫w躍,使得在PHP上實現(xiàn)MVC模式成為可能,但PHP語言的固有缺陷決定了完全的MVC模式在PHP上的效率較低且不易實現(xiàn)。較好的解決方案是基于被動MVC、模板解析技術(shù)和Table Data Gateway模式的數(shù)據(jù)訪問層來實現(xiàn)輕量級的PHP開發(fā)框架。
參考文獻:
[1]賈廣宇.MVC設(shè)計模式下Web開發(fā)框架的研究與應(yīng)用[D].大連:大連海事大學(xué),2006.
[2]任中方等.MVC模式研究的綜述[J].計算機應(yīng)用研究.2004.10:1-4.
[3]曾楠等.基于MVC模式的嵌入式Web設(shè)計方法[J].廈門大學(xué)學(xué)報.2006.2:196-198.
[4]仝戈,張武裝.Smarty在基于MVC框架的Web應(yīng)用程序開發(fā)中的應(yīng)用[J].科技信息.2009.31:839-840.
[5]陶勇,李曉軍.Hibernate ORM最佳實踐[M].北京:清華大學(xué)出版社:2007.22-25.