第13章 PHP的面向?qū)ο缶幊?ppt_第1頁(yè)
第13章 PHP的面向?qū)ο缶幊?ppt_第2頁(yè)
第13章 PHP的面向?qū)ο缶幊?ppt_第3頁(yè)
第13章 PHP的面向?qū)ο缶幊?ppt_第4頁(yè)
第13章 PHP的面向?qū)ο缶幊?ppt_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第13章 PHP的面向?qū)ο缶幊?面向?qū)ο缶幊蹋∣OP)是程序員編程的一項(xiàng)基本技能,PHP5對(duì)OOP提供了良好的支持。如何使用OOP的思想進(jìn)行PHP的高級(jí)編程,對(duì)于提高PHP編程能力和規(guī)劃好Web開(kāi)發(fā)構(gòu)架來(lái)說(shuō)都是非常有意義的。 通常在做一個(gè)有數(shù)據(jù)庫(kù)后臺(tái)的網(wǎng)站的時(shí)候,都會(huì)考慮到程序需要適用于不同的應(yīng)用環(huán)境。和其他編程語(yǔ)言不同的是,在PHP中,操作數(shù)據(jù)庫(kù)的是一系列的具體功能函數(shù)(如果不使用ODBC接口的話)。這樣做雖然效率很高,但是封裝卻不夠。如果有一個(gè)統(tǒng)一的數(shù)據(jù)庫(kù)接口,那么就可以不對(duì)程序做任何修改而適用于多種數(shù)據(jù)庫(kù),從而使程序的移植性和跨平臺(tái)能力都大大提高。,13.1 PHP中的類應(yīng)用,許多PHP

2、的愛(ài)好者在學(xué)習(xí)過(guò)程中感到對(duì)PHP中類的概念較難理解和掌握,雖然知道類既然存在就有其存在的道理,但是由于平時(shí)接觸和使用的機(jī)會(huì)較少,也就一略而過(guò)。其實(shí),只要讀者理解變量和函數(shù)這些PHP基本概念的話,掌握類的含義就不成問(wèn)題。 所謂類就是指由變量和作用于變量的函數(shù)組成的集合。類提供了一種對(duì)現(xiàn)實(shí)世界中事物的描述方式。通過(guò)有效的使用類,讀者可以將描述同一對(duì)象的多個(gè)變量和函數(shù)組合在一起,作為一個(gè)整體使用,從而使編寫出來(lái)的程序更直觀,更合理,更易于維護(hù)。,13.1.1 深入PHP中的類,當(dāng)定義一個(gè)類時(shí),實(shí)際上是聲明了它確切形式和屬性,這是通過(guò)指定類所包含的數(shù)量和對(duì)數(shù)據(jù)進(jìn)行的操作的代碼來(lái)實(shí)現(xiàn)的。也許有一些簡(jiǎn)單的

3、類僅包含代碼或數(shù)據(jù),但是,現(xiàn)實(shí)世界中的類都包含兩者。類的聲明是通過(guò)關(guān)鍵詞“class”來(lái)聲明的,其一般形式為: class classname 函數(shù)語(yǔ)句; 在PHP中面向?qū)?象編程是通過(guò)類來(lái)完成封裝的。下面通過(guò)一個(gè)實(shí)例來(lái)介紹一下類是如何來(lái)定義的,實(shí)例程序如代碼13-1所示。,13.1.2 類的繼承,可以像上一小節(jié)的演示$obj-x=6那樣,通過(guò)類引用方式來(lái)存取數(shù)據(jù)成員,這不是一個(gè)很好的OOP習(xí)慣。所以強(qiáng)烈建議通過(guò)方法來(lái)存取成員變量。如果把成員變量看成是不可處理的,并且只通過(guò)對(duì)象句柄來(lái)使用方法,那么你將是一個(gè)好的OOP程序員。不幸的是,PHP不支持聲明私有成員變量,所以不良代碼在PHP中也是允許

4、的。繼承在PHP中很容易實(shí)現(xiàn),只要使用extend關(guān)鍵字即可,實(shí)例代碼如代碼13-2所示。,13.1.3 類的構(gòu)造函數(shù),讀者可以在自己的類中定義構(gòu)造函數(shù)。構(gòu)造函數(shù)是一個(gè)與類名同名的方法,當(dāng)讀者創(chuàng)建一個(gè)類的對(duì)象時(shí)會(huì)被調(diào)用,例如代碼13-3所示。,13.1.4 抽象類和重載,OOP的一個(gè)很好的機(jī)制是使用抽象類。抽象類是不能實(shí)例化,只能提供給派生類一個(gè)接口。設(shè)計(jì)者通常使用抽象類來(lái)強(qiáng)迫程序員從基類派生,這樣可以確保新的類包含一些期待的功能。在PHP中沒(méi)有標(biāo)準(zhǔn)的方法,但是如果讀者需要這個(gè)特性,可以通過(guò)定義基類,并在它的構(gòu)造函數(shù)后加上“die” 的調(diào)用,這樣就可以保證基類是不可實(shí)例化的,現(xiàn)在在每一個(gè)方法接

5、口后面加上“die”語(yǔ)句。所以,如果一個(gè)程序員在派生類中沒(méi)有覆蓋方法,將引發(fā)一個(gè)錯(cuò)誤。而且因?yàn)镻HP 是無(wú)類型的,讀者可能需要確認(rèn)一個(gè)對(duì)象是來(lái)自于自己的基類的派生類,那么在基類中增加一個(gè)方法來(lái)實(shí)義類的身份,也就是返回某種標(biāo)識(shí)“id”,并且在讀者接收到一個(gè)對(duì)象參數(shù)時(shí)校驗(yàn)這個(gè)值。當(dāng)然,如果一個(gè)邪惡不好的程序員在派生類中覆蓋了這個(gè)方法,這種方法就不起作用了,不過(guò)一般問(wèn)題多發(fā)現(xiàn)在懶惰的程序員身上。 當(dāng)然,能夠讓基類對(duì)程序員無(wú)法看到是很好的,只要將接口打印出來(lái)做程序的工作就可以了。注意在PHP中沒(méi)有析構(gòu)函數(shù)。 重載與覆蓋不同,重載在PHP中不支持。在OOP中,讀者可以重載一個(gè)方法來(lái)實(shí)現(xiàn)兩個(gè)或重多的方法具

6、有相同的名字,但是有不同數(shù)量或類型的參數(shù)。PHP 是一種松散類型的語(yǔ)言,所以通過(guò)類型重載不起作用,然而通過(guò)參數(shù)的個(gè)數(shù)不同來(lái)重載也不起作用。,13.1.5 面向?qū)ο蟮亩鄳B(tài),多態(tài)是對(duì)象的一種能力,它可以在運(yùn)行時(shí)刻根據(jù)傳遞的對(duì)象參數(shù),決定調(diào)用哪一個(gè)對(duì)象的方法。例如,如果讀者有一個(gè)figure的類,它定義了一個(gè)draw的方法。并且派生了circle和rectangle 類,在派生類中讀者覆蓋了draw方法,讀者可能還有一個(gè)函數(shù),它希望使用一個(gè)參數(shù)x,并且可以調(diào)用$x-draw() 。如果讀者有多態(tài)性,調(diào)用哪個(gè)draw方法就依賴于讀者傳遞給這個(gè)函數(shù)的對(duì)象類型。 多態(tài)性在像PHP這樣的解釋語(yǔ)言中是非常容易

7、和自然的,所以PHP當(dāng)然支持多態(tài)性,代碼如13-6所示。,13.1.6 一個(gè)典型的數(shù)據(jù)庫(kù)操作類,初學(xué)者甚至一些非初學(xué)者常常犯的錯(cuò)誤,就是在開(kāi)發(fā)應(yīng)用程序的時(shí)候,缺乏對(duì)未來(lái)的考慮。如果有一天,讀者的程序需要使用其他的數(shù)據(jù)庫(kù),難道讀者還需要重新寫一篇針對(duì)于這個(gè)版本數(shù)據(jù)庫(kù)的程序嗎?這是程序常常會(huì)遇到的問(wèn)題,尤其是當(dāng)目前的數(shù)據(jù)庫(kù)可能不適合讀者當(dāng)前的需要的時(shí)候。 但是當(dāng)讀者做這一切的時(shí)候會(huì)發(fā)現(xiàn)絕非是想像的那樣容易,每一個(gè) DBMS 有不同的函數(shù)。舉例來(lái)說(shuō):在MySQL中連接數(shù)據(jù)庫(kù)的函數(shù)為 mysql_connect(),而在MSSQL卻是 mssql_connect()。重新查看讀者所有的代碼,然后修改所

8、有操作數(shù)據(jù)庫(kù)的函數(shù)和查詢語(yǔ)法,這絕不是一項(xiàng)簡(jiǎn)單的工作。程序會(huì)經(jīng)常的被捆綁到了錯(cuò)誤的數(shù)據(jù)庫(kù)上,以至無(wú)法在運(yùn)行時(shí)達(dá)到最優(yōu)性能。數(shù)據(jù)庫(kù)類庫(kù)就是這樣產(chǎn)生的。它允許讀者通過(guò)同樣的代碼來(lái)操作不同的數(shù)據(jù)庫(kù)。一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)類庫(kù)可以完美地改變這一切。它允許讀者通過(guò)極小的修改,就能轉(zhuǎn)接到其他數(shù)據(jù)庫(kù):無(wú)論讀者要連接什么數(shù)據(jù)庫(kù)管理系統(tǒng),只要使用同一個(gè)的函數(shù),和不同的參數(shù)。舉例來(lái)說(shuō), 在 ADOdb 中,只需簡(jiǎn)單地將 $db = NewADOConnection(access ) 修改為$db = NewADOConnection(mysql),這樣,讀者就輕松地把程序從 Access 數(shù)據(jù)庫(kù)轉(zhuǎn)移到了 MySQL

9、數(shù)據(jù)庫(kù)中?,F(xiàn)在網(wǎng)絡(luò)上已經(jīng)有很多這樣的數(shù)據(jù)庫(kù)類庫(kù),比如Pear,PHPlib,筆者已經(jīng)在工作中使用到這些,也許讀者也曾經(jīng)用過(guò)。但這里僅將重點(diǎn)放在讀者所特別關(guān)注的 ADOdb,只是要地對(duì)它做一個(gè)介紹,使讀者能夠馬上運(yùn)用它來(lái)開(kāi)發(fā)自己的下一個(gè)項(xiàng)目。,13.1.7 用文件上傳類輕松實(shí)現(xiàn)PHP文件上傳,文件上傳是Web開(kāi)發(fā)中的一個(gè)重要內(nèi)容。PHP可以支持多種瀏覽器上傳文件。這樣可以給用戶代來(lái)極大的方便。從而也提高了網(wǎng)站的整體性能。使用PHP上傳類可以大大提高程序的工作效率,也減少了程序員的工作量。因?yàn)楫?dāng)讀者需要修改程序時(shí),不需要每個(gè)頁(yè)面都去修改,只需要修改PHP文件上傳類就可以了,所以減少了程序員的工作量

10、。,13.2 PHP模板的應(yīng)用,在多人開(kāi)發(fā)大型PHP項(xiàng)目時(shí),模板技術(shù)非常有用,它可以分開(kāi)美工和程序員的工作,并且方便界面的修改和完善;不僅如此,利用模板技術(shù),還可以簡(jiǎn)單有效地定制或者修改站點(diǎn)?,F(xiàn)在筆者將要講述如何在PHP中應(yīng)用模板技術(shù)。 PHP的模板技術(shù)又分為:PHPLIB Template模板引擎、FastTemplate模板引擎、SMARTY模板引擎。,13.2.1 什么是模板技術(shù),什么是PHP的模板技術(shù)?PHP模板發(fā)展自Perl的Template。剝開(kāi)神秘的面紗,模板技術(shù)的核心概念是非常簡(jiǎn)單的。要將讀者的美工頁(yè)面指定為模板文件,只需將頁(yè)面中活動(dòng)的內(nèi)容如數(shù)據(jù)庫(kù)輸出、用戶交互等部分定義為變量

11、放在模板文件中相應(yīng)的位置,當(dāng)用戶瀏覽時(shí),由PHP程序文件打開(kāi)該模板文件,將模板文件中定義的變量進(jìn)行替換,當(dāng)然,替換成對(duì)應(yīng)的數(shù)據(jù)庫(kù)輸出或者用戶交互等動(dòng)態(tài)生成內(nèi)容。 模板能夠改善網(wǎng)站的結(jié)構(gòu),其特點(diǎn)有: 可以在幾秒鐘改變整個(gè)站點(diǎn)的外觀。 抽象程序設(shè)計(jì),沒(méi)有垃圾HTML代碼。 設(shè)計(jì)人員不需要關(guān)心全部的“模糊”代碼。 速度快。 現(xiàn)在PHP中應(yīng)用最多的模板有三種,SMARTY、Phplibtemplate和Fasttemplate,這三種模板作者雖然不同,但是在語(yǔ)法結(jié)構(gòu)和函數(shù)定義上卻有著驚人的相似之處。只要讀者掌握了其中的一個(gè),另一個(gè)相信讀者也會(huì)很快的熟練運(yùn)用。本章總括了使用模板的優(yōu)點(diǎn)和優(yōu)勢(shì),又分別介紹了

12、SMARTY、Phplibtemplate和Fasttemplate的使用方法和技巧,最后又對(duì)這兩種模板的效率進(jìn)行了對(duì)比。希望通過(guò)本章的介紹,能幫助那些想了解模板技術(shù)的讀者用最快的速度去掌握它,并在以后的編程中去應(yīng)用這項(xiàng)偉大的技術(shù)。,13.2.2 PHPLIB Template模板引擎介紹和使用實(shí)例,如果讀者正在設(shè)計(jì)一個(gè)交互式網(wǎng)站,一定會(huì)關(guān)注兩個(gè)主要的問(wèn)題,就是美工和程序。這也是一個(gè)網(wǎng)站在建設(shè)中拋開(kāi)其內(nèi)容之后最關(guān)鍵的要素。通常有兩種方式來(lái)協(xié)調(diào)美工和程序之間的關(guān)系: 先做好美工頁(yè)面,然后由程序員直接在美工頁(yè)面的HTML文件中嵌入ASP、JSP、PHP等程序代碼。當(dāng)然本書(shū)主要是介紹嵌入PHP程序代

13、碼。 美工和程序同時(shí)進(jìn)行,但這時(shí)因?yàn)闆](méi)有頁(yè)面框架,程序只能做出一些關(guān)鍵代碼,雙方完成后再進(jìn)行一次美工頁(yè)面和程序代碼的嵌入合成。 在實(shí)際的網(wǎng)站建設(shè)過(guò)程中,由于人員、進(jìn)度等環(huán)境的限制,大家通常會(huì)混合地使用上面兩種協(xié)調(diào)方式。然而這兩種方法都有不足之處,如下所示。 效率不高。兩者協(xié)調(diào)不好可能產(chǎn)生等待、重復(fù)代碼調(diào)試步驟等現(xiàn)象。 調(diào)試不暢。由于程序代碼最終需要嵌入在HTML頁(yè)面中,代碼的嵌入、調(diào)試、糾錯(cuò)都比較煩瑣。 維護(hù)不便。一旦美工設(shè)計(jì)需要修改,如網(wǎng)站改版,那么所有程序和HTML代碼混合頁(yè)面都需要重寫。,13.2.3 FastTemplate模板引擎介紹和使用實(shí)例,當(dāng)讀者在建立一個(gè)站點(diǎn)的時(shí)候,可能不得不

14、面對(duì)以下現(xiàn)實(shí),站點(diǎn)需要一名程序員來(lái)設(shè)計(jì)程序和一名網(wǎng)站設(shè)計(jì)者來(lái)組織頁(yè)面。那么,是否有使兩者很好的結(jié)合起來(lái)的方法呢?有的,就是使用模板FastTemplate技術(shù),這將會(huì)使你的工作更加輕松。下面解釋一下使用模板的好處: 在很短的時(shí)間內(nèi)可以替換整個(gè)站點(diǎn)的外觀。 使程序員可以抽象編程,而無(wú)須接觸HTML代碼。 速度非常之快。 可以重復(fù)利用以前的模板。,13.2.4 SMARTY模板引擎介紹和使用實(shí)例,smarty是一個(gè)使用PHP寫出來(lái)的模板PHP模板引擎,它提供了邏輯與外在內(nèi)容的分離,簡(jiǎn)單地講,目的就是要使PHP程序員同美工分離,使程序員改變程序的邏輯內(nèi)容不會(huì)影響到美工的頁(yè)面設(shè)計(jì),美工重新修改頁(yè)面不會(huì)

15、影響到程序的程序邏輯,這在多人合作的項(xiàng)目中顯的尤為重要,smarty的優(yōu)點(diǎn)有以下幾方面。 速度:采用smarty編寫的程序可以獲得最大速度的提高,這一點(diǎn)是相對(duì)于其他的模板引擎技術(shù)而言的。 編譯型:采用smarty編寫的程序在運(yùn)行時(shí)要編譯成一個(gè)非模板技術(shù)的PHP文件,這個(gè)文件采用了PHP與HTML混合的方式,在下一次訪問(wèn)模板時(shí)將WEB請(qǐng)求直接轉(zhuǎn)換到這個(gè)文件中,而不再進(jìn)行模板重新編譯。在源程序沒(méi)有改動(dòng)的情況下。 緩存技術(shù):smarty選用的一種緩存技術(shù),它可以將用戶最終看到的HTML文件緩存成一個(gè)靜態(tài)的HTML頁(yè),當(dāng)設(shè)定smarty的cache屬性為true時(shí),在smarty設(shè)定的cachetime期內(nèi)將用戶的WEB請(qǐng)求直接轉(zhuǎn)換到這個(gè)靜態(tài)的HTML文件中來(lái),這相當(dāng)于調(diào)用一個(gè)靜態(tài)的HTML文件。 插件技術(shù):smarty可以自定義插件。插件實(shí)際就是一些自定義的函數(shù)。 模板中可以使用ifelse等條件判斷語(yǔ)句。在模板文件使用判斷語(yǔ)句可以非常方便地對(duì)模板進(jìn)行格式重排。 上面介紹的是smarty的優(yōu)點(diǎn),下面介紹不適合使用smarty的地方。 需要實(shí)時(shí)更新的內(nèi)容。例如像股票顯示,它需要經(jīng)常對(duì)數(shù)據(jù)進(jìn)行更新,這類型的程序使用smarty會(huì)使模板處理速度變慢。 小項(xiàng)目:小項(xiàng)目因?yàn)轫?xiàng)目簡(jiǎn)單而美工與程序員兼于一人的項(xiàng)目,使用sma

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論