建立靈巧結(jié)構(gòu)的PHP程序
更新時(shí)間:2006年10月09日 00:00:00 作者:
很早就想寫這篇文章了,但一直沒(méi)有時(shí)間完成它。不是說(shuō)我來(lái)告訴大家如何做,我更希望本文只是做為一個(gè)引子,與大家來(lái)討論關(guān)于如何建立一個(gè)有效地、靈活的網(wǎng)絡(luò)應(yīng)用程序。
經(jīng)過(guò)了2-3年的網(wǎng)絡(luò)應(yīng)用程序開發(fā)工作,我的開發(fā)經(jīng)驗(yàn)變得更加生動(dòng)了,回過(guò)頭來(lái)看我以前為Geocrawler寫的代碼,簡(jiǎn)直不敢相信這是我的。由于GPL的原因,在PHPBuilder中的源碼也是良莠不齊的。
最近我做為一個(gè)有經(jīng)驗(yàn)的PHP開發(fā)者,一直在幫著寫SourceForge,我想這顯示出了最終結(jié)果的一個(gè)范圍。好的代碼應(yīng)被分成了多個(gè)部分,合適的庫(kù)及函數(shù)調(diào)用,清楚的數(shù)據(jù)庫(kù)結(jié)構(gòu),站點(diǎn)的每一個(gè)部分與其它部分都是相對(duì)獨(dú)立的。
但是,這仍不是最好的。如果我可以重做,我將更多的關(guān)注于HTML層與數(shù)據(jù)層的分離,通過(guò)對(duì)象及清楚的函數(shù)庫(kù)實(shí)現(xiàn)這一點(diǎn)。
優(yōu)美的圖形
我知道經(jīng)理們喜歡用優(yōu)美的圖形及圖表來(lái)描述它們,這將給我們留下最好的印象。用這種隱藏在一個(gè)結(jié)構(gòu)后的想法,你可以把你的邏輯與外觀分離,這意味著任何一個(gè)復(fù)雜的程序都可以用"API/Data Access Layer"來(lái)表述。
與其你把安全檢測(cè)、更新的句子等放在HTML層中,不如把它們整體地放在你的API層里。而這個(gè)HTML層只含有簡(jiǎn)單的函數(shù)調(diào)用和返回的數(shù)組、對(duì)象或自定的其它什么,以及一些數(shù)據(jù)庫(kù)的檢索結(jié)果的集合等。
如果你這樣做了,頂層將是非常的瘦小,你可以方便地創(chuàng)建及維護(hù)它。
如下的例子中,這個(gè)HTML接口中只有一些API層中的函數(shù)的直接調(diào)用,一些HTML工具庫(kù)(它能生成一個(gè)彈出框等等),和一些從數(shù)據(jù)庫(kù)抽象層中調(diào)用的數(shù)據(jù)庫(kù)操作方法(你不需要綁定某一個(gè)特別的數(shù)據(jù)庫(kù))。 基礎(chǔ)
靈活的PHP程序結(jié)構(gòu)最基本的方面有以下幾點(diǎn):
數(shù)據(jù)庫(kù)無(wú)關(guān)性
界面無(wú)關(guān)性
可移植性
面向?qū)ο蠡蛑辽賾?yīng)由函數(shù)庫(kù)組成
還有其它的?
當(dāng)然還有一些其它的東西,但我認(rèn)為那都是太大了,或許你自己能指出它們。
讓我們?cè)敿?xì)地談?wù)勊鼈兠恳粭l吧。
1、數(shù)據(jù)庫(kù)無(wú)關(guān)性
你從不知道你的站點(diǎn)將會(huì)在哪里運(yùn)行,當(dāng)然在你創(chuàng)建它時(shí),你希望它變和得很大并且有很高的流量。所以你不想把你自己約束在 MS Access 上面或者其它什么輕便的數(shù)據(jù)庫(kù)系統(tǒng)。雖然你不能立刻地插入各種不同的數(shù)據(jù)庫(kù)系統(tǒng),但是你有可能很方便地在它們中間切換。你有一些不同的選擇可以把你的數(shù)據(jù)庫(kù)調(diào)用抽象出來(lái)。在PHP中一個(gè)奇特的方法是你不得不為每個(gè)不同的數(shù)據(jù)庫(kù)系統(tǒng)寫出不同的代碼,因?yàn)樵赑HP中對(duì)每一種不同的數(shù)據(jù)庫(kù)的訪問(wèn)函數(shù)是不同的。為了避開這點(diǎn),你可以使用一個(gè)抽象地?cái)?shù)據(jù)庫(kù)訪問(wèn)層,就象PHPLib、下一個(gè)版本的PEAR、及我們?cè)赟ourceForge中描述的那樣。
2、界面無(wú)關(guān)性
一個(gè)應(yīng)用程序是它的技術(shù)更重要還是它所運(yùn)行的站點(diǎn)更重要?我們并不能真正地知道。我從來(lái)不相信這一點(diǎn)--HTML是一個(gè)標(biāo)準(zhǔn)。特別是對(duì)于一個(gè)網(wǎng)絡(luò)應(yīng)用程序而言,界面發(fā)生了改動(dòng),意味著我們不得不總是重寫。但是如果你的應(yīng)用程序是很大很復(fù)雜的,你就要為你的數(shù)據(jù)庫(kù)建立一些其它的接口了,只要你不想在你的站點(diǎn)程序中到處copy&paste你的訪問(wèn)檢查等代碼。這也意味著,如果你正確地設(shè)計(jì)了你的應(yīng)用程序,你可以很容易地改寫你的站點(diǎn)讓它適應(yīng)WAP,只要簡(jiǎn)單地寫一個(gè)小的WAP界面,并讓它調(diào)用你的數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象而已。但若你沒(méi)有很好地設(shè)計(jì)你的程序,你把你的HTML版改成WAP版是一個(gè)復(fù)雜的工程。
我把這個(gè)想法也帶入了SourceForge中,我們有一個(gè)巨大的用戶群,為我們發(fā)送/接收bugs、任務(wù)等。首先,我們指出所有的這些將通過(guò)我們的web頁(yè)面接口,然后,由于Eric Raymond 和其他人給的壓力,我們決定用XML來(lái)做數(shù)據(jù)庫(kù)的外部接口。
幸運(yùn)的是我們?cè)谒脑乱寻殉绦虻暮诵倪壿嫶a與它的界面分離了。我將試著表達(dá)我們是如何做的,希望對(duì)你的工作有所幫助。
這個(gè)SourceForge的bugs跟蹤器和其它的一些工具被分成兩個(gè)庫(kù)-這個(gè)HTML庫(kù)和數(shù)據(jù)訪問(wèn)庫(kù)。這個(gè)數(shù)據(jù)訪問(wèn)庫(kù)檢查輸入的值的正確性,處理安全校驗(yàn),并且當(dāng)成功/失敗時(shí)返回TRUE 或 FALSE。
由于簡(jiǎn)化的原因,這個(gè)例子并沒(méi)有基于一個(gè)完善的對(duì)象模式,那樣我還要解釋這個(gè)基類和它的一些衍生類等等,我想這個(gè)例子將給你一個(gè)最普通的想法。 HTML 庫(kù)的例子
//connect to database
require ("database.php");
//common utils like header/footer HTML
require ("html.php");
//data access library
require ("bug_data.php");
echo site_header("Page Title");
echo " Updating A Bug
";
if (bug_data_update($field1,$field2,$field3)) {
echo " Update Failed! ";
} else {
echo " Updated Bug Successfully ";
//echo the global error string
echo $feedback;
}
echo site_footer();
?>
Data 訪問(wèn)庫(kù)的例子
3、可移植性
毫無(wú)疑問(wèn),你不想讓你的代碼只能用于一個(gè)固定的站點(diǎn),將來(lái)我們可能改變色彩的選擇、元素的名稱、字體或其它一些什么,這樣應(yīng)設(shè)置一個(gè)config文件,它被多個(gè)頁(yè)面所包含。更好的觀點(diǎn)是你的站點(diǎn)被模塊化,你不需要copy&paste任何一個(gè)HTML文件,我傾向于把這些放入一個(gè)函數(shù),在任何需要的地方調(diào)用它們。
同樣的方法可用于數(shù)據(jù)庫(kù)的密碼、數(shù)據(jù)庫(kù)連接字串等,這些可以放入一個(gè)數(shù)據(jù)庫(kù)處理的抽象層中。
4、面向?qū)ο?函數(shù)化
我們不是用COBOL開發(fā),所以這意味著我們可以把進(jìn)程分成多個(gè)函數(shù)的調(diào)用。每個(gè)調(diào)用都是一個(gè)自動(dòng)的行為,有時(shí)僅僅是調(diào)用一小段其它的函數(shù)并返回這個(gè)結(jié)果。
一個(gè)好的例子是在每一個(gè)頁(yè)面校驗(yàn)用戶是否登錄,你可以用cookie或查詢數(shù)據(jù)庫(kù)來(lái)完成這個(gè)功能,但一旦你想改變你的驗(yàn)證系統(tǒng),你不得不改動(dòng)每一個(gè)頁(yè)面,其實(shí)你應(yīng)該可以通過(guò)改動(dòng)函數(shù)庫(kù)里一個(gè)普通的函數(shù)就完成這個(gè)變動(dòng)的。任何時(shí)候,你寫一段代碼,如果它將會(huì)被用于多于一個(gè)地方,你就要考慮把它放入一個(gè)庫(kù)里了。
其它還有什么?
顯然還有很多我沒(méi)有談到的事,告訴我你的想法,我將在下一篇文章中來(lái)討論它們。特別地是,如果你寫了一個(gè)大型的、復(fù)雜的應(yīng)用程序,我想聽聽你是如何規(guī)劃它的及你重做時(shí)不什么不同的想法。
相關(guān)文章
php 一維數(shù)組的循環(huán)遍歷實(shí)現(xiàn)代碼
一個(gè)簡(jiǎn)單的PHP循環(huán)一維數(shù)組的實(shí)例,先是把字符串按照一定的規(guī)則進(jìn)行轉(zhuǎn)換成為數(shù)組,然后再進(jìn)行遍歷輸出,實(shí)際是一個(gè)很簡(jiǎn)單的方法2017-04-04VML繪圖板②腳本--VMLgraph.js、XMLtool.js
VML繪圖板②腳本--VMLgraph.js、XMLtool.js...2006-10-10如何在PHP中使用Oracle數(shù)據(jù)庫(kù)(6)
如何在PHP中使用Oracle數(shù)據(jù)庫(kù)(6)...2006-10-10php利用cookie實(shí)現(xiàn)訪問(wèn)次數(shù)統(tǒng)計(jì)代碼
php 利用cookie實(shí)現(xiàn)訪問(wèn)次數(shù)統(tǒng)計(jì),需要的朋友可以參考下。2011-05-05PHP PDOStatement::debugDumpParams講解
今天小編就為大家分享一篇關(guān)于PHP PDOStatement::debugDumpParams講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01使用網(wǎng)絡(luò)地址轉(zhuǎn)換實(shí)現(xiàn)多服務(wù)器負(fù)載均衡
使用網(wǎng)絡(luò)地址轉(zhuǎn)換實(shí)現(xiàn)多服務(wù)器負(fù)載均衡...2006-10-103種平臺(tái)下安裝php4經(jīng)驗(yàn)點(diǎn)滴
3種平臺(tái)下安裝php4經(jīng)驗(yàn)點(diǎn)滴...2006-10-10