




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目錄:目錄一.本文目標(biāo)與聲明二.phplib的概述三.phplib的基本功能介紹 四.phplib基本安裝和使用五.如何使用phplib數(shù)據(jù)庫(kù)驅(qū)動(dòng)(一)六.如何使用phplib數(shù)據(jù)庫(kù)驅(qū)動(dòng)(二)七.如何使用phplib的Session功能八.使用phplib編程具體例子九.使用phplib編程具體例子(二)十.使用phplib編程具體例子(三)一.本文目標(biāo)與聲明 本文可以說(shuō)是筆者用phplib進(jìn)行開發(fā)的經(jīng)驗(yàn)與技巧總結(jié)。在開發(fā)期間,本人用phplib和自己寫的一些核心函數(shù)庫(kù)和類,用很短時(shí)間就開發(fā)了很多高效而強(qiáng)大的程序工具,足以表明模塊化面向?qū)ο缶幊痰暮锰帯?由于筆者使用phplib做開發(fā)的時(shí)間并不
2、很長(zhǎng),而且程序本身很多高級(jí)的算法并沒采用phplib,因此phplib的很多核心高級(jí)功能也沒有完全使用。水平有限,所以如果出現(xiàn)任何的錯(cuò)誤疏漏,請(qǐng)各位不吝賜教。 本文的目標(biāo)是期望讀者可以在短時(shí)間內(nèi)熟悉phplib的基本功能,并能夠利用它進(jìn)行中小型程序,例如簡(jiǎn)單的新聞發(fā)布,數(shù)據(jù)查詢,簡(jiǎn)單留言本和小論壇等。由于篇幅關(guān)系,phplib的一些高級(jí)應(yīng)用本文并未提及,請(qǐng)各位原諒。聲明:凡是參考本文章后如果出現(xiàn)任何錯(cuò)誤或者失誤,本人并不提供任何技術(shù)支持。 凡是發(fā)現(xiàn)本文的任何錯(cuò)誤,請(qǐng)給筆者發(fā)email或者oicq告訴,幫助筆者完善本文檔。 凡是與標(biāo)準(zhǔn)的phplib有出入的地方,請(qǐng)大家以標(biāo)準(zhǔn)phplib的為依據(jù)。
3、二.phplib的概述 現(xiàn)在互聯(lián)網(wǎng)上流行著很多優(yōu)秀的嵌入式的腳本語(yǔ)言,例如perl,php,asp,jsp等。其中最流行的一種就是php,它以全部公開代碼、開發(fā)容易、跨平臺(tái)、功能強(qiáng)大以及支持?jǐn)?shù)據(jù)庫(kù)類型繁多等特點(diǎn)贏得了網(wǎng)上眾多程序員的青睞。 而隨著php的應(yīng)用和推廣,php的眾多開發(fā)人員和很多愛好者在php的基礎(chǔ)上開發(fā)了很多php的程序庫(kù),這些程 序庫(kù)包括了大量的類、方法、變量和方法,能夠處理復(fù)雜的web資源和提供強(qiáng)大的功能,大大簡(jiǎn)化了程序設(shè)計(jì)和提高了代碼的可重用性。其中phplib就是這 些庫(kù)中相當(dāng)優(yōu)秀的產(chǎn)品,它特別在數(shù)據(jù)庫(kù)訪問(wèn)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)以及訪問(wèn)認(rèn)證和模板等方面具有很高的價(jià)值和實(shí)用性。用來(lái)開
4、發(fā)大中型程序是相當(dāng)適合的。 利用phplib可以非常輕易的開發(fā)出跨硬件、操作系統(tǒng)平臺(tái)和數(shù)據(jù)庫(kù)無(wú)關(guān)的 程序,其中很多優(yōu)秀的程序都是采用了phplib來(lái)開發(fā)的。例如著名的phpslash就是一個(gè)例子。由于有了面向?qū)ο髱?kù)和類的支持,數(shù)據(jù)庫(kù)驅(qū)動(dòng)都由類來(lái) 完成,因此寫程序的時(shí)候基本上不需要考慮用的是什么數(shù)據(jù)庫(kù)和如何驅(qū)動(dòng)數(shù)據(jù)庫(kù),只需要懂得標(biāo)準(zhǔn)SQL語(yǔ)言就可以了。phpslash一旦安裝好后就可以很好 的運(yùn)行,提供優(yōu)異的用戶認(rèn)證功能。即使在不支持session的php3下也可以很正常的使用session。并且它可以運(yùn)行在nt或者unix平臺(tái)下, 支持多達(dá)7種數(shù)據(jù)庫(kù)而程序從一個(gè)平臺(tái)或者系統(tǒng)轉(zhuǎn)移到另外一個(gè)平臺(tái)或
5、者系統(tǒng)上的時(shí)候,程序行本身一個(gè)字也不需要改動(dòng)。有關(guān)phplib的詳細(xì)信息和文檔可以到use.de 查找。三.phplib的基本功能介紹 phplib包含了很多功能,提供了眾多的函數(shù)。然后根據(jù)筆者經(jīng)驗(yàn),覺得只要很好掌握其中的基本類和方法后,平時(shí)的工作幾乎都不需要那些額外的高級(jí)類就可以完成了。 1.將數(shù)據(jù)庫(kù)驅(qū)動(dòng)和對(duì)數(shù)據(jù)庫(kù)操作完全分離,這樣的好處是對(duì)數(shù)據(jù)庫(kù)的操作你需要的知識(shí)僅僅是SQL語(yǔ)言而不需要去估計(jì)各 個(gè)不同數(shù)據(jù)庫(kù)間的函數(shù)不同,如果需要將程序移植的話,那么phplib的優(yōu)勢(shì)非常明顯。需要修改的僅僅是數(shù)據(jù)庫(kù)驅(qū)動(dòng)文件,而程序行幾乎都不需要修改任何一 行。如果是采用具體數(shù)據(jù)庫(kù)函數(shù)操作的程序(例如用My
6、SQL函數(shù)編寫),那么移植起來(lái)幾乎是等于重新編寫。區(qū)別一看就知道了。 2.支持Session,這個(gè)功能可以創(chuàng)建一個(gè)受保護(hù)的頁(yè)面。它可以廣泛的應(yīng)用 到需要進(jìn)行登陸或者依靠帳號(hào)和權(quán)限來(lái)判別的程序。例如論壇、虛擬社區(qū)、新聞發(fā)布、用戶管理、電子商務(wù)等。而且這個(gè)和純粹的cookie不同,采用了 base_64的編碼和解碼。因此一般并不容易破譯。為了加強(qiáng)安全性,用戶可以自己編寫自己的編碼方式取代它原來(lái)的編碼方式。 同時(shí)phplib還將每一個(gè)會(huì)話都保存到數(shù)據(jù)庫(kù)中,因此可以通過(guò)查詢數(shù)據(jù)庫(kù)值得有多少用戶在線上。 3. 權(quán)限許可(Perm),這個(gè)功能可以定義一系列具有不同級(jí)別和權(quán)限的用戶。不需要編程人員額外地自己
7、編寫相應(yīng)功能的代碼就可以實(shí)現(xiàn)了分級(jí)管理和限制。同時(shí) 可以利用phplib中page/admin目錄中的管理程序創(chuàng)建用戶和修改相關(guān)信息。編程人員可以修改這些程序來(lái)服務(wù)自己的系統(tǒng),節(jié)省了大量時(shí)間。4. 模板templete,和FastTemplete類似的是,phplib也有自己的模板功能類和文件。讓用戶可以方便的創(chuàng)建和修改html模板,并且將 php代碼和html代碼分離。便于讓程序員和美工良好的合作。phplib的模板采用了定義標(biāo)記和語(yǔ)法分析、模式匹配等技術(shù),從而實(shí)現(xiàn)了和 FastTemplete類似的功能。編程人員可以根據(jù)實(shí)際的需要對(duì)這個(gè)功能代碼進(jìn)行修改以滿足自己需求。5.購(gòu)物車Cart,這
8、個(gè)是個(gè)比較簡(jiǎn)易的購(gòu)物車,各種物品和項(xiàng)目可以存放到車中,也可以被取出來(lái),通過(guò)一些改造后也可以將這個(gè)功能做成電子商務(wù)中流行的購(gòu)物系統(tǒng)的。 6.Html部件,在phplib中還有一些稱為"HTML Widgets"的東西,可以方便地生成窗口/表格等。具體可以參考phplib手冊(cè)。這里不再贅述。四.phplib基本安裝和使用 要想使用phplib強(qiáng)大的功能,有幾種途徑可以達(dá)到目的。 1.采用phplib建議的安裝方式,說(shuō)安裝,其實(shí)就是把phplib的類預(yù)先讓解析器加載到內(nèi)存,這樣使用的時(shí)候就 不需要做任何設(shè)置,這樣的好處顯而易見。不過(guò)缺點(diǎn)也是很多的,如果程序按照這個(gè)方式直接引用ph
9、plib的函數(shù)的話,對(duì)于一些采用虛擬主機(jī)的用戶來(lái)說(shuō),如 果ISP的服務(wù)器沒有安裝phplib的話,就不可以直接使用phplib了。所以這個(gè)方式的前提是:你的ISP支持phplib或者你有權(quán)限控制web 服務(wù)器,對(duì)于一般用戶在自己機(jī)器上調(diào)試的話,這個(gè)方式比較好。詳細(xì)做法這里不再贅述,只簡(jiǎn)單說(shuō)個(gè)過(guò)程而已:a.下載phplib最新包,并解壓好。b.將里面的php目錄的內(nèi)容放到一個(gè)安全的地方,例如/usr/local/phplib下 c.將這個(gè)目錄的路徑名添加到php3.ini/php.ini的include關(guān)鍵字段后include .:/usr/local/phplib 然后在找到auto_prep
10、end_file關(guān)鍵字改成:auto_prepend_file = prepend.php3 重新啟動(dòng)一次web服務(wù)器,用phpinfo()函數(shù)檢查包含路徑和自動(dòng)預(yù)加載參數(shù),如果顯示的值和剛才設(shè)定的一樣的話就證明成功了。更加詳細(xì)的安裝/設(shè)定可以參考phplib的文檔。 2. 包含的方式。這個(gè)方式就是比較麻煩,但是好處就是對(duì)于使用虛擬主機(jī)的用戶來(lái)說(shuō),可以不需要ISP支持phplib就能享受phplib的功能。基本方法很 簡(jiǎn)單,可以在使用到phplib功能的程序最頂部加入相應(yīng)的包含文件。不過(guò)要注意文件之間的相互依賴關(guān)系,下面是一個(gè)簡(jiǎn)單例子,它可以調(diào)用到基本的 MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)功能和Sessio
11、n功能:$LIBDIR = " /usr/local/phplib "require($LIBDIR . "db_mysql.inc"); require($LIBDIR . "ct_sql.inc");require($LIBDIR . "session.inc"); require($LIBDIR . "local.inc"); require($LIBDIR . "page.inc");五.如何使用phplib數(shù)據(jù)庫(kù)驅(qū)動(dòng)(一) 第一部份:數(shù)據(jù)庫(kù)連接/查詢 a.四步曲:【
12、ChinaByte 教程】1.要根據(jù)庫(kù)中的DB_Sql來(lái)編寫一個(gè)類,這個(gè)只需要在你的頂層包含文件中定義好就行了,同一個(gè)程序使用時(shí)不需要重定義,例子是:class slashDB extends DB_Sql var $classname="slashDB" /* Remember to change the below items to match your db */var $Host = "localhost" var $Database = "abc"var $User = "abc"var $Passwor
13、d = "abc" function halt($msg) printf("數(shù)據(jù)庫(kù)出現(xiàn)錯(cuò)誤!: %s n", $msg);printf("MySQL 錯(cuò)誤!: %s (%s) n", $this->Errno, $this->Error);printf("請(qǐng)聯(lián)系WebMaster并報(bào)告此出錯(cuò)信息得詳細(xì)內(nèi)容。n "); die("Session 掛起。"); 其中slashDB的名字是任意的,根據(jù)編程者的喜好設(shè)定,不過(guò)都建議用extends語(yǔ)句生成的類的名字 最好都有DB兩個(gè)字。例如u
14、serDB,slashDB。并且$classname要和class slashDB extends DB_Sql中 slashDB一樣!否則類定義出錯(cuò)。其他需要修改的僅僅是類的名字,$classname,$Host,$Database ,$User,$Password等需要修改。函數(shù)halt是錯(cuò)誤提示。你可以自定義到一個(gè)頁(yè)面。 2.使用編寫好的類的時(shí)候,用new關(guān)鍵字 $abc = new slashDB; 其中$abc是個(gè)變量名,這代表你要使用slashDB類的功能。3.查詢數(shù)據(jù)庫(kù) 一般有2個(gè)方法,短的查詢直接將語(yǔ)句寫到函數(shù),長(zhǎng)的就先用一個(gè)變量分別儲(chǔ)存再查詢。 a. 短語(yǔ)句:$abc->
15、;query("SELECT * FROM user WHERE username='kk' AND passwd='kk' "); 注意的是這里是一個(gè)調(diào)用slash類中的方法query,并且數(shù)據(jù)庫(kù)查詢語(yǔ)句不能漏了" ",否則出錯(cuò)。b.長(zhǎng)語(yǔ)句 $q = "SELECT username,passwd,email,nation,url,edulev"$q .= ",seclev FROM user WHERE username='$username' " $q .= &
16、quot;AND aid='$aid' ORDER BY ID DESC" $abc->query($q); /這里才執(zhí)行查詢采用了短語(yǔ)句合成長(zhǎng)語(yǔ)句的方法。其中需要注意的是第一個(gè)$q是起始的語(yǔ)句,不能跟“.”號(hào)!接著同名的$q就是需要和第一個(gè)$q合成的變量,其實(shí)是同一個(gè)變量但是分別賦一個(gè)長(zhǎng)語(yǔ)句的不同 部分。因?yàn)闉榱吮苊饣ハ喔采w就用“.”號(hào)!切記切記! 另外查詢語(yǔ)句中該有空格的必須有空格,即使該行沒有,下一行也必須有。例如$q .= ",seclev FROM user WHERE username='$username' "句
17、中最后有一個(gè)空格如果他沒有,而接著的行開頭沒有的話,數(shù)據(jù)庫(kù)查詢會(huì)出錯(cuò)的。4.取得結(jié)果 $abc->next_record(); 這個(gè)是一個(gè)沒有返回值的語(yǔ)句,他只會(huì)讓Record;這個(gè)方法產(chǎn)生相應(yīng)的查詢 結(jié)果。如果沒有這句話就不會(huì)產(chǎn)生相應(yīng)的結(jié)果。next_record()是將當(dāng)前指針向前移動(dòng)并更新Record 、Error、Row、Errno的函數(shù)。因此不運(yùn)行他一定不能夠產(chǎn)生你需要的結(jié)果。$temail = $abc->Record"email" $turl = $abc->Record"url" 這幾句就是將查詢后的結(jié)果賦值給指定的變量
18、。 注意:一般如果返回的row超過(guò)一行,你就要用習(xí)慣方法: while($abc->next_record() php代碼 來(lái)進(jìn)行處理了。這個(gè)方法就是便歷了所有查詢到的結(jié)果。六.如何使用phplib數(shù)據(jù)庫(kù)驅(qū)動(dòng)(二) 第二部份:數(shù)據(jù)庫(kù)插入/刪除 b. 插入/兩步曲: 【ChinaByte 教程】1.創(chuàng)建一個(gè)調(diào)用類的變量 $add = new slashDB;2.進(jìn)行數(shù)據(jù)庫(kù)查詢操作(實(shí)際上無(wú)論是SELECT還是INSERT等語(yǔ)句都是調(diào)用query方法和MySQL交互的)$add->query("INSERT INTO vars VALUES ('a','
19、;b','c')"); 注意這里其實(shí)INSERT語(yǔ)句有很多寫法,其中最多用的就是以下幾種:(1).直接賦值:INSERT INTO 表名字 VALUES (值列表,用''號(hào)包含,用,號(hào)分隔);例子:$add->query("INSERT INTO vars VALUES ('a','b','c')");(2).指定插入字段:INSERT INTO 表名字 (指定字段名字列表) VALUES (對(duì)應(yīng)字段值);例子:$add->query("INSERT IN
20、TO vars (name,mail) VALUES ('kk','kkk')"); 兩者差別在于第一種必須給所有字段賦值,無(wú)論是空還是非空都要賦值,如果數(shù)據(jù)表有很多字段 而你開始只需要插入很少幾個(gè)字段,那么就會(huì)浪費(fèi)很多人力了。第一種適合于字段少的情況。第二種就是為了處理第一種的缺陷的。但是不適合于數(shù)據(jù)表字段少的情況。 刪除/兩步曲:1.創(chuàng)建一個(gè)調(diào)用類的變量$del = new slashDB;2.查詢操作$del->query("DELETE FROM user WHERE username='kk' AND pass
21、wd='kk'"); 一般這是刪除某一條特定記錄。如果要?jiǎng)h除全部?jī)?nèi)容更加容易。只需要DELETE FROM 數(shù)據(jù)庫(kù)表名字可以了。c.數(shù)據(jù)庫(kù)內(nèi)容更新更新/兩步曲:1.創(chuàng)建一個(gè)調(diào)用類的變量 $update = new slashDB;2.查詢操作 $q = "UPDATE user SET username='$username',passwd='$pwd',email='$mail' " $q .= "WHERE ID='$id' AND DATE='$date'
22、;" $update->query($q);這里UPAATE就沒有什么特殊的格式,基本上都是UPDATE 數(shù)據(jù)庫(kù)表 SET 字段名='字段值' 判斷條件(WHERE語(yǔ)句)。這個(gè)加入了WHERE語(yǔ)句是為了更新某一條特定的記錄。 七.如何使用phplib的Session功能 基本的Session使用方法 【ChinaByte 教程】以下就是一個(gè)以用戶登陸和注銷為例子的Session使用例子,通過(guò)它你就會(huì)明白如何使用session以及Session是如何起作用的。你也會(huì)體會(huì)到使用了Phplib/Zsulib的好處和帶來(lái)的便利。a.建立一個(gè)Session的類class
23、slashSess extends Session var $classname = "slashSess" / 和定義DB_Sql的道理一樣var $magic = "fkIsNotEqualToIK" / 隨機(jī)化Session的字符串,建議用函數(shù)生成唯一串 var $mode = "cookie" / 在GET模式時(shí)使用cookie var $lifetime = 86400; / session cookie的生存時(shí)間(單位:秒) var $that_class = "slash_sql" / 要使用的目標(biāo)數(shù)
24、據(jù)庫(kù)名字(一般情況并沒用上)var $allowcache = "no" / 是否使用緩沖?有3個(gè)選項(xiàng):no/public/private 注意:其中slashSess這個(gè)名字可隨便修改的,但是和定義 DB_Sql的extends一樣要保證和$classname名字一樣就可以了。其中這個(gè)定義了類slashSess的式子中,$magic的字串建議 使用隨機(jī)函數(shù)產(chǎn)生獨(dú)立的字串以避免重復(fù)。以下我給出一個(gè)小函數(shù),以生成一個(gè)指定字長(zhǎng)的獨(dú)立隨機(jī)串: /* function: unimagic() 版本:1.0 日期:2000/8/9 編寫地:北京parameter: $length 需
25、要產(chǎn)生的隨機(jī)串的長(zhǎng)度,默認(rèn)是8位,最長(zhǎng)32位 */function unimagic($length="8") srand(double)microtime()*1000000);$ran = rand();$md5 = md5($ran); $magic = substr($md5,0,$length); return $magic; b.使用Session功能 本部分配合例子Login.php來(lái)說(shuō)明如何運(yùn)用Phplib/Zsulib中session.inc文件中相關(guān)函數(shù)/類,這里分幾個(gè)部分: 利用page_open函數(shù)打開一個(gè)類對(duì)應(yīng)方法的數(shù)組; 注冊(cè)提交的一些參數(shù); 利
26、用page_close函數(shù)關(guān)閉頁(yè)面同時(shí)保存注冊(cè)的信息; 釋放注冊(cè)的參數(shù)。結(jié)束一個(gè)Session會(huì)話。 這個(gè)小程序的流程(為了突出重點(diǎn),這里盡量簡(jiǎn)化程序,多余的部分全部刪除) 初始化頁(yè)面->page_open調(diào)用Session(開始)->$op=login,注冊(cè)提交參數(shù) $op=logout,釋放參數(shù)。1.初始化頁(yè)面 這里需要用到兩個(gè)類slashDB和slashSess;其中這兩個(gè)類都在前面文檔中提到。這兩個(gè)類假定存放在config.php文件里。因此首先必須包含這個(gè)文件以便可以調(diào)用這兩個(gè)類。/范例頁(yè)面 ver 0.1 2000/8/24 /$ID:Login.php By hzqb
27、bc in hp$/require "config.php"/開始定義函數(shù)function display_login() 內(nèi)容 function error_msg() 內(nèi)容 /結(jié)束定義函數(shù)2.page_open調(diào)用Session開始 /調(diào)用page_open函數(shù),其中slashSess是在config.php定義好的類 page_open(array("sess"=>"slashSess");注意:盡量不要在page_open前require一些會(huì)產(chǎn)生html代碼或者進(jìn)行輸出html代碼的操作。否則會(huì)出現(xiàn)提示說(shuō)已經(jīng)發(fā)送了He
28、ader信息而不能再次發(fā)送的錯(cuò)誤。 3.如果$op=login,進(jìn)行登陸操作并注冊(cè)信息:if ($op="login") if (isset($passwd) && isset($username) /判斷用戶名和密碼是否空?否就繼續(xù) $sl_q = new slashDB;/調(diào)用類$q = "SELECT seclev FROM user WHERE username='$username' AND passwd='$passwd'" $sl_q->query($q);/查詢結(jié)果 /如果結(jié)果非空(意
29、味著用戶密碼名字都正確)就繼續(xù)if ($sl_q->next_record() $seclev = $sl_q->Record"seclev"/給$seclev賦值 /調(diào)用register函數(shù),將所有需要記錄的變量全部注冊(cè)$sess->register("username"); $sess->register("seclev");$sess->register("passwd"); 4.如果$op=logout,進(jìn)行注銷信息操作 if ($op="logout")
30、/調(diào)用delete函數(shù)刪除注冊(cè)的變量$sess->delete(); /刪除后,對(duì)變量進(jìn)行重新賦值并初始化成原始狀態(tài)$seclev = "0" $passwd = "" $username = "" exit;echo "你已經(jīng)注銷了!" 5.結(jié)束本程序在結(jié)束前必須調(diào)用page_close();這樣就完成了一個(gè)完整的Session會(huì)話。 如果已經(jīng)執(zhí)行了logout操作就不要執(zhí)行了。所以完整語(yǔ)句是:if ($op!="logout") page_close(); 結(jié)束:一定要注意程序編寫順序
31、,否則會(huì)產(chǎn)生邏輯錯(cuò)誤。本例子就是一個(gè)最簡(jiǎn)單的用戶登陸的模型所有采用Phplib的用戶管理模式都和這個(gè)差不多。八.使用phplib編程具體例子 1.一些聲明 關(guān)于本例子,本例子原來(lái)是為本協(xié)會(huì)(中山大學(xué)GNU/Linux協(xié)會(huì))內(nèi)部會(huì)員編寫的,因此從比較長(zhǎng)遠(yuǎn)的角度考慮 來(lái)編寫,考慮比較多的是代碼編寫規(guī)范和習(xí)慣與算法。考慮到這些因素對(duì)編程也是很重要的,因此相關(guān)的章節(jié)與內(nèi)容我并沒有刪除,如果讀者覺得這部分沒必要的話 請(qǐng)email通知筆者,謝謝。 2.代碼的編寫風(fēng)格 這里講的 不是如何寫注釋或者是如何寫版權(quán)信息,而是提出若干比較有代表性和比較優(yōu)美的編程習(xí)慣(這里稱做風(fēng)格)。一般來(lái)說(shuō),php和perl等we
32、b腳本程序,都 不可避免地和html等扯上關(guān)系。而相當(dāng)多的程序員并沒有很好地注意自己的php/perl代碼和html代碼的關(guān)系,造成了程序行艱澀難懂,結(jié)構(gòu)混亂最 后連自己都懶得看的結(jié)局。本人從開發(fā)ZSU-Slash-Pro的這一個(gè)月里發(fā)現(xiàn),優(yōu)秀的程序不僅僅有優(yōu)秀的算法,還有優(yōu)美而易懂的程序結(jié)構(gòu)。尤其對(duì)于大型程序來(lái)說(shuō),如果代碼含糊,結(jié)構(gòu)混亂的話,即使是程序開發(fā)者本人,看起代碼也會(huì)覺得格外費(fèi)力,其他人看起來(lái)就更加辛苦了。 因此很有必要摸索并制訂出一套合適的編寫代碼的規(guī)范,用這套規(guī)范來(lái)約束和統(tǒng)一程序開發(fā)人員開發(fā)的代碼風(fēng)格。使之易于閱讀和修改,方便日后維護(hù)和進(jìn)一步開發(fā)的人員,使調(diào)試程序簡(jiǎn)單化成為可能。
33、這里,我主要參考了PHPSlash和phplib和FreeTrade等幾個(gè)中大型程序,結(jié)合自己的一點(diǎn)小經(jīng)驗(yàn),總結(jié)出了以下幾點(diǎn):(1).通用內(nèi)容做成包含文件 這個(gè)方法是將每個(gè)生成的頁(yè)面都會(huì)包含的通用內(nèi)容做成包含文件,這樣減少了程序的長(zhǎng)度。便于統(tǒng)一修改例如phpslash中它每個(gè)頁(yè)面都要使用一個(gè)統(tǒng)一的 Header/Footer,因此只需要?jiǎng)?chuàng)建兩個(gè)包含文件slashhead.inc和slashfoot.inc文件,然后在每個(gè)php程序中使用 require語(yǔ)句包含它們進(jìn)入代碼內(nèi)部就可以了。 注意:并不是只規(guī)定使用header和footer,如果你愿意,你可以添加任意多個(gè)require的部分。(2)
34、.公共函數(shù)庫(kù)對(duì)于那些經(jīng)常使用的函數(shù)和變量,沒必要在每個(gè)程序內(nèi)都定義和聲明,而只需要將它們放到一個(gè)公共的函數(shù)/配置文件內(nèi)就行了。 例如PHPSlash中有幾十個(gè)函數(shù),這些函數(shù)都統(tǒng)一地存放到functions.inc中,并被包含在了配置文件config.php3中。這樣所有頁(yè)面調(diào)用到里面的函數(shù)時(shí)候就不需要定義而只需要直接調(diào)用就可以了。 (3).html代碼生成函數(shù)(庫(kù)) 對(duì)于一些經(jīng)常需要編寫的html代碼,可以用一個(gè)專門的函數(shù)生成這些html代碼。 例如一個(gè)顯示登陸的對(duì)話框,你就可以將這個(gè)對(duì)話框的內(nèi)容編寫一個(gè)函數(shù)叫dsp_login()。這樣每次你需要顯示的時(shí)候只需要直接調(diào)用這個(gè)函數(shù)就可以 了。同
35、樣道理,你可以將生成頁(yè)面的頭部和尾部都做成一個(gè)函數(shù),例如叫put_header()和put_footer()等。這樣就很輕松地將html代 碼和php代碼分離了。(4).封裝過(guò)程 盡量隱藏具體操作的過(guò)程,取代的是面向?qū)ο蟮念惢蛘吣硞€(gè)操作函數(shù)。這樣的好處就是將過(guò)程封裝起來(lái),使主程序簡(jiǎn)潔明快、層次清楚。例如某個(gè)注冊(cè)程序,它需要完成顯示注冊(cè)窗口、檢索用戶、顯示出錯(cuò)、插入用戶、發(fā)送電子郵件等5個(gè)功能。如果把這5個(gè)功能都全部用一般的過(guò)程設(shè)計(jì)的話,代碼相對(duì)難懂。如果換成5個(gè)操作函數(shù)(或者說(shuō)把具體分析操作過(guò)程封裝起來(lái)的話)那么就非常簡(jiǎn)潔而易懂。以下是程序主體:dsp_reg();check_user();i
36、f ($return="true") insert_user();mail_user(); else dsp_error(); 可見這樣的程序即使是初學(xué)者都很容易看懂。 (5).功能分塊化盡量將程序需要執(zhí)行的功能分化成對(duì)應(yīng)的操作/動(dòng)作,也就是分塊化,好處是易于程序調(diào)試,條理清楚。 一個(gè)最好的例子就是PHPSlash的admin.php3。它將所有的功能都?xì)w納成了一個(gè)op值。 例如要?jiǎng)h除一個(gè)用戶->$op="userdelete"。其實(shí)它這里還有一個(gè)小技巧:就是不是直接調(diào)用某個(gè)op而是在表單發(fā)送的時(shí)候發(fā)的是另外 一個(gè)值user_ops,這個(gè)值有幾個(gè)可
37、能:刪除/添加/更新。那么它在程序內(nèi)有一個(gè)判斷陣列,判斷出這個(gè)user_ops應(yīng)該對(duì)應(yīng)什么op,因此方便設(shè) 計(jì)程序。這里假設(shè)一個(gè)發(fā)布新聞的簡(jiǎn)單系統(tǒng),所需要的功能就是發(fā)布新聞,刪除新聞,更新新聞。 那么歸納成以下3個(gè)op:post/delete/update,以下是結(jié)構(gòu)流程(用swich語(yǔ)句):swich($op) case "post": postnews(); break;case "delete": delete();break;case "update": update();break;default: dsp_news();
38、由以上幾點(diǎn)可以看出,如果是能夠按照上面提到的幾點(diǎn)設(shè)計(jì)程序的話, 那么你設(shè)計(jì)的就會(huì)是個(gè)結(jié)構(gòu)良好,代碼優(yōu)美易懂的好程序。不過(guò),這還必須取決于良好的程序設(shè)計(jì)構(gòu)思。以下給出一個(gè)注冊(cè)程序的例子,它體現(xiàn)了本文和本編程規(guī)范 提到的大部分內(nèi)容。整個(gè)程序從設(shè)計(jì)到完工的時(shí)間僅僅用了5個(gè)小時(shí)。雖然并不快,但是基本上是一寫好就運(yùn)轉(zhuǎn)正常,沒有什么邏輯錯(cuò)誤,結(jié)構(gòu)也比較清楚。 接下來(lái)讀者將看到如何利用以上技巧和原則編寫一個(gè)具體的程序。 九.使用phplib編程具體例子(二) 3.具體程序設(shè)計(jì) (1).功能要求: 這里需要做的是一個(gè)注冊(cè)程序,它的功能要求是:能夠自動(dòng)注冊(cè)一個(gè)合法用戶,并且將自動(dòng)為用戶生成一個(gè)8位的密碼并發(fā)送到
39、用戶的郵箱。其中標(biāo)識(shí)用戶的是唯一的用戶名字和唯一且真實(shí)的電子郵箱。申請(qǐng)的流程是:先輸入用戶想注冊(cè)的用戶名字和他的真實(shí)電子郵箱。 -> 然后系統(tǒng)查詢這個(gè)用戶的名字和郵箱是否存在于數(shù)據(jù)庫(kù)中-> 如果其中一者存在,則顯示錯(cuò)誤并返回重新輸入 -> 如果兩者都在系統(tǒng)數(shù)據(jù)庫(kù)中沒有記錄,說(shuō)明用戶可以注冊(cè),顯示歡迎畫面-> 顯示確認(rèn)畫面并注冊(cè)用戶信息-> 自動(dòng)生成密碼并發(fā)送到用戶郵箱。 (2).程序流程: 基本上都和申請(qǐng)流程類似。根據(jù)每個(gè)功能的不同設(shè)計(jì)不同的函數(shù)進(jìn)行操作: a.顯示查詢頁(yè)面dsp_query();/空白模式 輸入查詢數(shù)據(jù),下一步b.執(zhí)行查詢函數(shù)query(); 如
40、果成功,則下一步如果不成功則顯示錯(cuò)誤并返回 c.顯示確認(rèn)頁(yè)面 confirm_reg(); dsp_reg();/保存模式 發(fā)送表單d.插入用戶 reg(); 加入判斷:是否多次刷新頁(yè)面,如果是就不顯示“恭喜”字樣。insert(); mail_user();success();(3).功能函數(shù):這里動(dòng)用到10個(gè)函數(shù)。各個(gè)函數(shù)的功能如下:dsp_query();/顯示查詢畫面和確認(rèn)畫面并自動(dòng)根據(jù)不同畫面選擇不同op查詢: op=check 確認(rèn): op=insert query();/查詢函數(shù),查詢輸入的用戶和郵箱是否存在 confirm_reg();/確認(rèn)要注冊(cè)的函數(shù)reg();插入用戶的主
41、函數(shù),完成主要的動(dòng)作make_passwd();/生成8位隨機(jī)密碼insert();/插入用戶信息的函數(shù) mail_user();發(fā)送注冊(cè)信息和用戶密碼到用戶信箱的函數(shù) success();/注冊(cè)成功函數(shù),顯示成功信息 error_msg();/擁有各種模式的錯(cuò)誤提示函數(shù)current_time();/提示當(dāng)前系統(tǒng)時(shí)間的函數(shù) (4).頁(yè)面結(jié)構(gòu): 采用了header和footer包含的技術(shù)。并且所有和數(shù)據(jù)庫(kù)連接的類和配置都定義在config.php3中并且使用Zsulib。其中調(diào)用到Zsulib中的面向?qū)ο蟮臄?shù)據(jù)庫(kù)連接技術(shù)。 主體結(jié)構(gòu)是: Header.incregister.php3 ->
42、; require "config.php3" Footer.inc 十.使用phplib編程具體例子(三) (5).開始具體編寫 編寫Header.inc,F(xiàn)ooter.inc(略)編寫具體函數(shù)和相關(guān)接口 (6).解決關(guān)鍵的技術(shù)問(wèn)題a.如何編寫query()呢? 這個(gè)函數(shù)需要的功能就是查詢發(fā)送過(guò)來(lái)的用戶名和郵箱是否已經(jīng)給注冊(cè),如果其中之一或者全部都給注冊(cè)了后就返回錯(cuò)誤信息,否則進(jìn)入confim_reg()函數(shù)。設(shè)計(jì)思路:先向數(shù)據(jù)庫(kù)查詢發(fā)送過(guò)來(lái)的$username和$email看是否返回空值。然后判斷兩個(gè)字段的查詢值是否=""。這就完成了基本的查詢功能了
43、。以下是query();的完整代碼:function query($username,$email) $sl_q = new userDB;$sl_q->query("SELECT username,email FROM user WHERE username='$username' or email='$email'");$sl_q->next_record(); $tusername = $sl_q->Record"username"$temail = $sl_q->Record"em
44、ail" if ($username=$tusername && $tusername!="") error_msg("user_exist"); elseif ($email=$temail && $temail!="") error_msg("mail_exist");elseif ($tusername="" && $tmail="" && $username!="" &
45、;& $email!="")confirm_reg($username,$email); else error_msg("unknown"); b.如何編寫make_passwd()呢?此函數(shù)負(fù)責(zé)生成隨機(jī)的8位密碼。 設(shè)計(jì)思路:可以利用unix系統(tǒng)的random守護(hù)進(jìn)程產(chǎn)生的隨機(jī)因子,也可以利用php的隨機(jī)函數(shù)rand同時(shí)為了獲得指定的8為密碼必須采用一個(gè)能夠從字符串中切取到給定長(zhǎng)度字符串的函數(shù)。這里我們采用substr。以下是make_passwd();基本代碼 function make_passwd() $ran = rand();$pas
46、swd = substr($ran,0,8);return $passwd; c.如何編寫confim_reg()?要達(dá)到能夠提示你確認(rèn)這個(gè)功能并不容易。因?yàn)楸仨殐纱握{(diào)用dsp_query()而兩次dsp_query()卻需要完成不同的功能。因此必須讓confim_reg()傳送若干參數(shù)給dsp_query()讓它知道應(yīng)該如何操作。設(shè)計(jì)思路:讓confim_reg()傳一個(gè)$msg給dsp_query(),讓它知道這是確認(rèn)的信息以轉(zhuǎn)換功能。以下是confim_reg()完整代碼:function confirm_reg($un,$em) $time = current_time(); $msg ="<center>恭喜你!在<font color=red>$time</font>這一刻你的用戶名和郵箱還沒有給注冊(cè)!<br>如果你確實(shí)想成為本站會(huì)員,請(qǐng)按<font color=red><b>注冊(cè)</b></font>按鈕。<p></center>"dsp_query($un,$em,"我要注冊(cè)","$msg"); d.如何編寫dsp_query()呢? 該函數(shù)功能稍微要復(fù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院顧問(wèn)合同范本
- 勞務(wù)施工電梯合同范本
- 加工制造合同范本
- 協(xié)議單合同范本
- 北京裝修勞務(wù)合同范本
- 加盟串串香合同范本
- 住宅用地轉(zhuǎn)讓買賣合同范本
- 倉(cāng)庫(kù)維修協(xié)議合同范本
- 個(gè)人定制菜地合同范本
- 中介轉(zhuǎn)租店鋪合同范本
- 《攝影圖片分析》課件
- 青少年社會(huì)支持評(píng)定量表
- kW直流充電樁的設(shè)計(jì)
- 施工圖總目錄
- 《裝配化工字組合梁鋼橋六車道3x30m通用圖》(3911-05-2021)【可編輯】
- 02S404給排水圖集標(biāo)準(zhǔn)
- 人民醫(yī)院診斷證明書
- 六年級(jí)勞動(dòng)與技術(shù)下冊(cè)《課程綱要》
- 掛牌督辦安全生產(chǎn)重大事故隱患銷號(hào)申請(qǐng)表
- 2023纖維增強(qiáng)水泥擠出成型中空墻板
- 頸源性頭痛課件
評(píng)論
0/150
提交評(píng)論