面向?qū)ο缶幊虆R總課件_第1頁
面向?qū)ο缶幊虆R總課件_第2頁
面向?qū)ο缶幊虆R總課件_第3頁
面向?qū)ο缶幊虆R總課件_第4頁
面向?qū)ο缶幊虆R總課件_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 面向?qū)ο缶幊堂嫦驅(qū)ο笏枷霕?gòu)造方法與析構(gòu)方法的使用類與對象的使用繼承與多態(tài)的使用第五章 面向?qū)ο缶幊堂嫦驅(qū)ο笏枷腩惻c對象的使用5.1面向?qū)ο蟾攀?.2類與對象5.2類與對象5.3構(gòu)造方法與析構(gòu)函數(shù)5.4類常量和靜態(tài)成員5.5繼承5.6自動加載及魔術(shù)方法5.7抽象類與接口5.8多態(tài)5.9設(shè)計模式5.10命名空間5.1面向?qū)ο蟾攀?.2類與對象5.2類與對象5.3構(gòu)造方法5.1 面向?qū)ο蟾拍蠲嫦驅(qū)ο笫且环N符合人類思維習(xí)慣的編程思想?,F(xiàn)實生活中存在各種形態(tài)不同的事物,這些事物之間存在著各種各樣的聯(lián)系。在程序中使用對象來映射現(xiàn)實中的事物,使用對象的關(guān)系來描述事物之間的聯(lián)系,這種思想就是面向?qū)ο蟆?/p>

2、5.1 面向?qū)ο蟾拍蠲嫦驅(qū)ο笫且环N符合人類思維習(xí)慣的編程思想5.1 面向?qū)ο蟾拍蠲嫦驅(qū)ο蟮奶攸c主要可以概括為封裝性、繼承性和多態(tài)性,具體介紹如下所示。1、封裝性封裝是面向?qū)ο蟮暮诵乃枷?,將對象的屬性和行為封裝起來,不需要讓外界知道具體實現(xiàn)細(xì)節(jié),這就是封裝思想。2、繼承性繼承性主要描述的是類與類之間的關(guān)系,通過繼承,可以在無需重新編寫原有類的情況下,對原有類的功能進(jìn)行擴(kuò)展。5.1 面向?qū)ο蟾拍蠲嫦驅(qū)ο蟮奶攸c主要可以概括為封裝性、繼承5.1 面向?qū)ο蟾拍?、多態(tài)性多態(tài)性指的是同一操作作用于不同的對象,會產(chǎn)生不同的執(zhí)行結(jié)果。例如,當(dāng)聽到“Cut” 這個單詞時,理發(fā)師的表現(xiàn)是剪發(fā),演員的行為表現(xiàn)是停止

3、表演,不同的對象,所表現(xiàn)的行為是不一樣的。5.1 面向?qū)ο蟾拍?、多態(tài)性5.2 類與對象在面向?qū)ο蟮乃枷胫刑岢隽藘蓚€概念,即類和對象。其中,類是對某一類事物的抽象描述,而對象用于表示現(xiàn)實中該類事物的個體。接下來通過一個圖例來演示類與對象之間的關(guān)系,如下圖所示??梢詫⑼婢吣P涂醋魇且粋€類,將一個個玩具看作對象,從玩具模型和玩具之間的關(guān)系便可以看出類與對象之間的關(guān)系。從圖中可以明顯看出對象是根據(jù)類創(chuàng)建的,并且一個類可以對應(yīng)多個對象。5.2 類與對象在面向?qū)ο蟮乃枷胫刑岢隽藘蓚€概念,即類和對象5.2 類與對象5.2.1 類的定義類用于描述一組對象的共同特征和行為。類中可以定義字段和方法。類的定義語法

4、格式如下:通過class關(guān)鍵字可以定義一個類。在類中聲明的變量被稱為成員屬性,主要用于描述對象的特征。在類中聲明的函數(shù)被稱為成員方法,主要用于描述對象的行為。class 類名 成員屬性; 成員方法; 5.2 類與對象5.2.1 類的定義class 類名5.2 類與對象5.2.2 對象的創(chuàng)建根據(jù)類創(chuàng)建實例對象,使用new關(guān)鍵字來創(chuàng)建對象,其格式如下:“$對象名”表示一個對象的引用名稱,通過這個引用就可以訪問對象中的成員,其中$符號是固定寫法,對象名是自定義的?!皀ew”表示要創(chuàng)建一個新的對象,“類名”表示新對象的類型?!皡?shù)1,參數(shù)2”中的參數(shù)是可選的。對象創(chuàng)建成功后,就可以通過“對象-成員”的

5、方式來訪問類中的成員。$對象名 = new 類名(參數(shù)1,參數(shù)2,); 需要注意的是,如果在創(chuàng)建對象時,不需要傳遞參數(shù),則可以省略類名后面的括號,即“new 類名;”。5.2 類與對象5.2.2 對象的創(chuàng)建$對象名 = new 5.2 類與對象5.2.3 類的封裝所謂類的封裝是指在定義一個類時,將類中的屬性私有化,即使用private關(guān)鍵字來修飾。私有化的屬性只能在它所在類中被訪問。5.2 類與對象5.2.3 類的封裝所謂類的封裝是指在定義一5.2 類與對象5.2.3 類的封裝為了能讓外界訪問私有屬性,PHP提供了兩種形式,具體如下所示。1、通過getXxx()和setXxx()方法訪問私有屬

6、性為了可以訪問私有屬性,可以手動編寫公有的getXxx()和setXxx()方法,其中,getXxx()方法用于獲取屬性值,setXxx()方法用于設(shè)置屬性值。2、通過_get()和_set ()方法訪問私有屬性PHP5中預(yù)定義了_get()方法和_set()方法,_get()方法用于獲取屬性私有成員的屬性值,_set()方法用于為私有成員屬性賦值,兩個方法獲取私有屬性和設(shè)置私有屬性時都是自動調(diào)用的。5.2 類與對象5.2.3 類的封裝5.2 類與對象5.2.4 特殊的this對象一旦被創(chuàng)建,在對象的每個成員方法中都會存在一個特殊的對象引用“$this”,它代表當(dāng)前對象,用于完成對象內(nèi)部成員之

7、間的訪問。其語法格式如下:$this- 屬性名;注意:this不能在類定義的外部使用,只能在類定義的方法中使用。5.2 類與對象5.2.4 特殊的this$this- 屬5.3 構(gòu)造方法和析構(gòu)方法5.3.1 構(gòu)造方法在每個類中,都有一個構(gòu)造方法,在創(chuàng)建對象時會被自動調(diào)用。如果在類中沒有顯式的聲明它,PHP會自動生成一個沒有參數(shù),且沒有任何操作的默認(rèn)構(gòu)造方法。當(dāng)在類中顯式聲明了構(gòu)造方法時默認(rèn)構(gòu)造方法將不存在。聲明構(gòu)造方法和聲明成員方法類似,其語法格式如下:修飾符 function _construct(參數(shù)列表) /初始化操作需要注意的是構(gòu)造方法的名稱必須為_construct(),修飾符可以省

8、略,默認(rèn)為public。5.3 構(gòu)造方法和析構(gòu)方法5.3.1 構(gòu)造方法修飾符 fun5.3 構(gòu)造方法和析構(gòu)方法5.3.1 構(gòu)造方法注意:構(gòu)造方法沒有返回值。構(gòu)造方法的作用是完成對新對象的初始化,并不是創(chuàng)建對象本身。在創(chuàng)建新對象后,系統(tǒng)會自動調(diào)用該類的構(gòu)造方法,不需要手動調(diào)用。 一個類有且只有一個構(gòu)造方法,在php5后雖然_construct()和類名()可以共存,但只能使用一個。構(gòu)造方法和普通方法一樣,可以訪問類屬性和方法,也有訪問控制修飾符,還可以被其它方法調(diào)用。5.3 構(gòu)造方法和析構(gòu)方法5.3.1 構(gòu)造方法注意:5.3 構(gòu)造方法和析構(gòu)方法5.3.1 析構(gòu)方法析構(gòu)方法是PHP5中新添加的內(nèi)容

9、,它在對象銷毀之前會被自動調(diào)用,用于釋放內(nèi)存。其語法格式具體如下:function _destruct()/清理操作需要注意的是,析構(gòu)方法的名稱必須為“_destruct()”,且析構(gòu)方法不帶任何參數(shù)。5.3 構(gòu)造方法和析構(gòu)方法5.3.1 析構(gòu)方法functio 多學(xué)一招在PHP中使用了一種“垃圾回收”機(jī)制,即自動清理不再使用的對象,釋放內(nèi)存,析構(gòu)方法也會自動被調(diào)用。所以在一般情況下不需要手動調(diào)用析構(gòu)方法,只需明確析構(gòu)方法的在何時被調(diào)用的即可。 多學(xué)一招在PHP中使用了一種“垃圾回收”機(jī)制,即自動清理不5.4 類常量和靜態(tài)成員5.4.1 類常量在類中,有些屬性的值不能改變,并且希望被所有對象所

10、共享,例如圓周率,它是一個數(shù)學(xué)常數(shù),在數(shù)學(xué)物理計算中廣泛使用,此時可以將表示圓周率的成員屬性定義為常量。類常量在定義時需要使用const關(guān)鍵字來申明,示例代碼如下:const PI = 3.1415926; /定義一個常量屬性PI使用const關(guān)鍵字來聲明常量,常量名前不需要添加$符號,并且在聲明的同時必須對其進(jìn)行初始化工作。5.4 類常量和靜態(tài)成員5.4.1 類常量const PI 5.4 類常量和靜態(tài)成員5.4.1 類常量注意:需要注意的是,在類中定義的常量只能是基本數(shù)據(jù)類型的值,而且必須是一個定值,不能是變量、類的屬性、數(shù)學(xué)運算的結(jié)果或函數(shù)調(diào)用。類常量一旦設(shè)置后就不能改變,如果試圖在程序

11、中改變它的值,則會出現(xiàn)錯誤。且在聲明類常量時一定要賦初始值,因為后期沒有其它方式為其賦值。5.4 類常量和靜態(tài)成員5.4.1 類常量注意:5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員靜態(tài)成員也可以實現(xiàn)類的所有對象共享一份數(shù)據(jù)。它被static關(guān)鍵字修飾,不屬于任何對象,只屬于類。靜態(tài)成員包括靜態(tài)屬性和靜態(tài)方法,具體如下所示。1、靜態(tài)屬性靜態(tài)屬性數(shù)據(jù)在內(nèi)存中只有一份,并且可以被類的所有實例對象所共享。定義靜態(tài)屬性的語法格式如下:訪問修飾符 static 變量名在語法格式中,static關(guān)鍵字寫在訪問修飾符的后面,訪問修飾符可以省略,默認(rèn)為public。5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員

12、訪問修飾符 st5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員注意:需要注意的是,靜態(tài)屬性是屬于類而非對象,所以不能使用“對屬性”的方式來訪問,而應(yīng)該通過“類名:屬性”的方式來訪問,如果是在類的內(nèi)部,還可以使用self關(guān)鍵字代替類名。5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員注意:5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員2、靜態(tài)方法在不創(chuàng)建對象的情況下就可以調(diào)用某個方法,也就是使該方法不必和對象綁在一起,可以使用靜態(tài)方法。靜態(tài)方法在定義時只需在方法名前加上static關(guān)鍵字,其語法格式如下:訪問修飾符 static 方法名()靜態(tài)方法的使用規(guī)則和靜態(tài)屬性相同,即通過類名稱和范圍解析操作符(

13、:)來訪問靜態(tài)方法。5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員訪問修飾符 st5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員注意:在靜態(tài)方法中,不要使用$this。因為靜態(tài)方法是屬于類的,而$this則是指對象上下文。在靜態(tài)方法中,一般只對靜態(tài)屬性進(jìn)行操作。5.4 類常量和靜態(tài)成員5.4.2 靜態(tài)成員注意:5.5 繼承5.5.1 繼承的概念在程序中,繼承描述的是事物之間的所屬關(guān)系,通過繼承可以使多種事物之間形成一種關(guān)系體系。例如貓和狗都屬于動物,程序中便可以描述為貓和狗繼承自動物。同理,波斯貓和巴厘貓繼承自貓,而沙皮狗和斑點狗繼承自狗。這些動物之間會形成一個繼承體系,具體如下圖所示。5.5 繼

14、承5.5.1 繼承的概念5.5 繼承5.5.1 繼承的概念在PHP中,類的繼承是指在一個現(xiàn)有類的基礎(chǔ)上去構(gòu)建一個新的類,構(gòu)建出來的新類被稱作子類,現(xiàn)有類被稱作父類,子類會自動擁有父類所有可繼承的屬性和方法。在程序中,如果想聲明一個類繼承另一個類,需要使用extends關(guān)鍵字,具體語法格式如下:class 子類名 extends 父類名/類體在PHP中只能實現(xiàn)單繼承,也就是說子類只能繼承一個父類(是指直接繼承)。5.5 繼承5.5.1 繼承的概念class 子類名 ext5.5 繼承5.5.2 重寫父類方法在繼承關(guān)系中,子類會自動繼承父類中定義的方法,但有時在子類中需要對繼承的方法進(jìn)行一些修改,

15、即對父類的方法進(jìn)行重寫。需要注意的是,在子類中重寫的方法需要和父類被重寫的方法具有相同的方法名、參數(shù)。要調(diào)用父類中被重寫的方法,需要使用parent關(guān)鍵字,由于parent關(guān)鍵字引用的是一個類而不是一個方法,因此需要使用范圍解析操作符(:)。注意:子類方法重寫父類方法時,訪問權(quán)限不能小于父類方法的訪問權(quán)限。例如父類的方法是public的,在子類中重寫時只能是public的。5.5 繼承5.5.2 重寫父類方法注意:5.5 繼承5.5.3 final關(guān)鍵字在繼承的過程中要保證某些類或方法不被改變,就需要使用final關(guān)鍵字。被final修飾的類和成員方法不能被修改。1、final關(guān)鍵字修飾類PH

16、P中的類被final關(guān)鍵字修飾后,該類將不可以被繼承,也就是不能夠派生子類。2、final關(guān)鍵字修飾方法當(dāng)一個類的方法被final關(guān)鍵字修飾后,這個類的子類將不能重寫該方法。5.5 繼承5.5.3 final關(guān)鍵字5.6自動加載及魔術(shù)方法5.6.1 自動加載從外部引入一個class,通常會使用include和require方法把定義這個class的文件包含進(jìn)來。但是,在大型的開發(fā)項目中,這么做會產(chǎn)生大量的require或者include方法的調(diào)用,這樣不僅會降低效率,而且使代碼難以維護(hù)。如果不小心忘記引入某個類的定義文件,PHP就會報告一個致命錯誤,導(dǎo)致整個應(yīng)用程序崩潰。為解決此問題,PHP提

17、供了類的自動加載機(jī)制,定義一個_autoload()函數(shù),它會在試圖使用尚未被定義的類時自動調(diào)用。這樣,PHP在報告錯誤之前會有最后一個機(jī)會加載所需的類。5.6自動加載及魔術(shù)方法5.6.1 自動加載5.6自動加載及魔術(shù)方法5.6.1 自動加載注意:需要注意的是,自動加載是指當(dāng)需要類定義文件而沒有找到時,會自動的調(diào)用_autoload()函數(shù),它不只限于實例化對象,還包括繼承,序列化等操作。而且,自動加載并不能自己完成加載類的功能,它只提供了一個時機(jī),具體的加載代碼還需要用戶編寫代碼實現(xiàn)。5.6自動加載及魔術(shù)方法5.6.1 自動加載注意:5.6自動加載及魔術(shù)方法5.6.2 魔術(shù)方法PHP中有很多

18、以兩個下劃線開頭的方法,如前面介紹的_construct()、_autoload()、_get()和_set(),這些方法被稱為魔術(shù)方法。魔術(shù)方法有一個特點就是不需要手動調(diào)用,在某一時刻會自動執(zhí)行,為程序的開發(fā)帶來了極大的便利。在PHP中提供了多個魔術(shù)方法,接下來列舉這些常用的魔術(shù)方法,如下表所示。5.6自動加載及魔術(shù)方法5.6.2 魔術(shù)方法5.6自動加載及魔術(shù)方法5.6.2 魔術(shù)方法方法聲明功能描述_sleep()對象序列化之前被調(diào)用,使程序延緩一段時間執(zhí)行_wakeup()對象反序列化時被調(diào)用,還原被序列化的對象_toString()輸出一個對象時被調(diào)用,將對象轉(zhuǎn)化為字符串_call()在

19、對象中調(diào)用一個不可訪問方法時會被調(diào)用 _callStatic()用靜態(tài)方式中調(diào)用一個不可訪問方法時被調(diào)用_clone() 克隆對象時被調(diào)用 _invoke()當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個對象時被調(diào)用5.6自動加載及魔術(shù)方法5.6.2 魔術(shù)方法方法聲明功能描述5.7抽象類與接口5.7.1 抽象類當(dāng)在定義一個類的時候,其中所需的某些方法暫時并不能完全定義出來,而是讓其繼承的類來實現(xiàn),此時就可以用到抽象類。定義抽象類需要使用abstract關(guān)鍵字來修飾,語法格式具體如下:只有方法聲明而沒有方法體的方法稱為抽象方法,在子類繼承時再來編寫該方法的具體實現(xiàn)。其語法格式如下:abstract class

20、類名/類的成員abstract function 方法名();5.7抽象類與接口5.7.1 抽象類abstract cla5.7抽象類與接口5.7.1 抽象類注意:抽象類不能被實例化。抽象類可以沒有抽象方法,但有抽象方法的抽象類才有意義。一旦類包含了抽象方法,則這個類必須聲明為abstract。抽象類中可以有非抽象方法, 成員屬性和常量。抽象方法不能有函數(shù)體,它只能存在于抽象類中。如果一個類繼承了某個抽象類,則它必須實現(xiàn)該抽象類的所有抽象方法,除非它自己也聲明為抽象類。5.7抽象類與接口5.7.1 抽象類注意:5.7抽象類與接口5.7.2 接口如果一個抽象類中的所有方法都是抽象的,則可以將這個

21、類用另外一種方式來定義,即接口。在定義接口時,需要使用interface關(guān)鍵字,具體示例代碼如下:定義接口與定義類類似,但其中定義所有的方法都是空的。需要注意的是接口中的所有方法都是公有的,也不能使用final關(guān)鍵字來修飾。interface Animal public function run(); public function breathe();由于接口中定義的都是抽象方法,沒有具體實現(xiàn),需要通過類來實現(xiàn)接口。實現(xiàn)接口使用implements關(guān)鍵字。5.7抽象類與接口5.7.2 接口interface An 多學(xué)一招在使用implements關(guān)鍵字實現(xiàn)接口的同時,還可以使用extend

22、s關(guān)鍵字繼承一個類。即在繼承一個類的同時實現(xiàn)接口,但一定要先使用extends繼承一個類,再使用implements實現(xiàn)接口,具體示例如下所示:實現(xiàn)接口可以看作是對繼承的一種補(bǔ)充。實現(xiàn)接口可在不打破繼承關(guān)系的前提下,對某個類功能擴(kuò)展,非常靈活。class 類名 extends 父類名 implements 接口1,接口2,接口n /實現(xiàn)所有接口中的抽象方法 多學(xué)一招在使用implements關(guān)鍵字實現(xiàn)接口的同時,還5.8 多態(tài)在設(shè)計一個成員方法時,通常希望該方法具備一定的通用性。例如要實現(xiàn)一個動物叫的方法,由于每個動物的叫聲是不同的,因此可以在方法中接收一個動物類型的參數(shù)的對象。當(dāng)傳入貓類對象

23、時就發(fā)出貓類的叫聲,傳入犬類對象時就發(fā)出犬類的叫聲,這種向方法中傳入不同的對象,方法執(zhí)行效果各異的現(xiàn)象就是多態(tài)。5.8 多態(tài)在設(shè)計一個成員方法時,通常希望該方法具備一定的通5.9 抽象類與接口5.9.1 單例模式單例模式是PHP中的一種設(shè)計模式,它是指在設(shè)計一個類時,需要保證在整個程序運行期間針對該類只存在一個實例對象。就像世界上只有一個月亮,假設(shè)現(xiàn)在要設(shè)計一個類表示月亮,該類只能有一個實例對象,否則就違背了事實。單例模式(Singleton)用于為一個類生成一個唯一的對象。5.9 抽象類與接口5.9.1 單例模式5.9 抽象類與接口5.9.2 工廠模式工廠模式的作用就是“生產(chǎn)”對象。工廠方法

24、的參數(shù)是要生成對象的類名。5.9 抽象類與接口5.9.2 工廠模式5.10 命名空間5.10.1 為什么使用命名空間在程序開發(fā)過程中經(jīng)常會涉及到大量的代碼,而代碼在編寫時不可避免的可能會出現(xiàn)重名問題,當(dāng)這些重名的類被調(diào)用時就會導(dǎo)致錯誤。因此在PHP語言中提出了命名空間這一概念,來解決在編寫類庫或應(yīng)用程序時出現(xiàn)的重名問題。命名空間用于解決同名問題。同時還可以為標(biāo)識符很長的名稱創(chuàng)建別名,提高程序的可讀性。5.10 命名空間5.10.1 為什么使用命名空間5.10 命名空間5.10.2 命名空間的定義命名空間是用關(guān)鍵字namespace來聲明,定義一個命名空間的代碼如下:上述代碼中namespace

25、是表示命名空間的關(guān)鍵字,MyProject是表示命名空間名,需要注意的是命名空間的聲明必須在其他所有代碼之前。 5.10 命名空間5.10.2 命名空間的定義?php5.10 命名空間5.10.3 命名空間的使用PHP命名空間中類名可以通過以下三種方式引用:非限定名稱:即直接使用類名稱,如$a = new foo()。它表示使用的是當(dāng)前命名空間的foo類。限定名稱:即在類名前面添加前綴,如$a = new subnamespacefoo()。它表示使用的當(dāng)前命名空間下子命名空間subnamespace下的foo類。完全限定名稱:即在類名前面添加命名空間前綴,如果有子命名空間也要寫上,如$a = new currentnamespacefoo()。它以命名空間反斜線開頭的標(biāo)識符,表示根命名空間下的子命名空間currentnamespace下的foo類。5.10 命名空間5.10.3 命名空間的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論