




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——PHP面向?qū)ο缶幊讨钊肜斫夥椒≒HP面向?qū)ο缶幊讨钊肜斫夥椒?/p>
文章主要介紹了PHP面向?qū)ο缶幊讨钊肜斫夥椒ㄖ剌d與方法籠罩(多態(tài))的相關(guān)資料,需要的摯友可以參考下
什么是多態(tài)?
多態(tài)(Polymorphism)按字面的意思就是"多種狀態(tài)'。在面向?qū)ο笳Z(yǔ)言中,接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。引用CharlieCalverts對(duì)多態(tài)的描述多態(tài)性是允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作(摘自"Delphi4編程技術(shù)內(nèi)幕')。簡(jiǎn)樸的說(shuō),就是一句話:允許將子類類型的指針賦值給父類類型的指針(沒(méi)錯(cuò)這段話來(lái)自百度百科)。那么多態(tài)的作用是什么,它有什么實(shí)際開發(fā)價(jià)值呢?在實(shí)際的應(yīng)用開發(fā)中,采用面向?qū)ο笾械亩鄳B(tài)主要在于可以將不同的子類對(duì)象都當(dāng)作一個(gè)父類來(lái)處理,并且可以屏蔽不同子類對(duì)象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
下面就是PHP中多態(tài)的兩個(gè)實(shí)現(xiàn)
方法重載(overload)
重載是類的多態(tài)的一種實(shí)現(xiàn)。函數(shù)重載指一個(gè)標(biāo)識(shí)符被用作多個(gè)函數(shù)名,且能夠通過(guò)函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類型將這些同名的函數(shù)區(qū)分開來(lái),調(diào)用不發(fā)生混淆。即當(dāng)調(diào)用的時(shí)候,雖然方法名字一致,但根據(jù)參數(shù)的不同可以自動(dòng)調(diào)用相應(yīng)的函數(shù)。
classA
publicfunctiontest
echotest1;
publicfunctiontest$a
echotest2;
$a=newA;
$a-test;
$a-test$a;
假使php直接支持方法重載的話。那么上面的例子執(zhí)行后傳參和不傳參就會(huì)返回不同的.值。然而php并不直接支持重載,這就意味著你假設(shè)直接按上面這樣定義的話,就會(huì)報(bào)錯(cuò)的。會(huì)報(bào)什么錯(cuò)呢?會(huì)報(bào)如下的錯(cuò)誤。
這意思就是不能重復(fù)定義A函數(shù),報(bào)錯(cuò)的行數(shù)也正是下面這行。
publicfunctiontest$a
所以說(shuō)php是并不直接支持重載的。合著說(shuō)了這么半天php并不支持。。別急,我說(shuō)的是并不直接支持,所以說(shuō)是我們可以讓php間接支持。這時(shí)候就要用到一個(gè)函數(shù)來(lái)支持重載了。就是__call。__call方法務(wù)必帶有兩個(gè)參數(shù)。第一個(gè)包含了被調(diào)用的方法名稱,而其次個(gè)參數(shù)包含了傳遞給該方法的參數(shù)數(shù)組??梢酝ㄟ^(guò)這個(gè)方法實(shí)現(xiàn)類似于函數(shù)重載的功能??聪旅娴拇a。
publicfunction__call$method,$p
if$method==display
ifis_object$p[0]
$this-displayObject$p[0];
elseifis_array$p[0]
$this-displayArray$p[0];
else
$this-displayScalar$p[0];
//下面是對(duì)上面定義的調(diào)用
$ov=newoverload;
$ov-displayarray1,2,3;
$ov-displaycat;
定義方法的時(shí)候,可以看到有三個(gè)分支,假設(shè)一個(gè)對(duì)象傳遞給display方法,就調(diào)用的是displayObject方法;假設(shè)傳遞的是一個(gè)數(shù)組,調(diào)用displayArray;傳遞的是其他的內(nèi)容的話,那么調(diào)用的是displayScalar方法。。。可以看到下面調(diào)用時(shí),第一個(gè)是傳遞了一個(gè)數(shù)組,那么調(diào)用displayArray。其次個(gè)傳入的不是對(duì)象也不是數(shù)組,那么屬于其他內(nèi)容,調(diào)用的是displayScalar方法。所以這樣子就用__call方法實(shí)現(xiàn)了類似于其他語(yǔ)言的方法重載。
方法籠罩(override)
所謂籠罩,從本質(zhì)上來(lái)說(shuō)就是重寫。就是當(dāng)子類繼承父類的一些方法后,子類又在其內(nèi)部定義了一致的方法,那么這個(gè)新定義的方法會(huì)籠罩繼承而來(lái)的父類的方法,子類只能調(diào)用其內(nèi)部定義的方法。
有以下幾點(diǎn)要求:
1.當(dāng)一個(gè)父類和子類有一個(gè)方法,參數(shù)和名字完全一致,那么子類方法會(huì)籠罩父類的方法。
2.在實(shí)行方法籠罩的時(shí)候,訪問(wèn)修飾符可以是不一樣的,但是子類的訪問(wèn)范圍務(wù)必大于等于父類的訪問(wèn)范圍。
3.要求參數(shù)和名字一樣。并不是要求子類,父類名稱一致。
下面是對(duì)這幾點(diǎn)的解釋:
第一點(diǎn),務(wù)必參數(shù)一致,才會(huì)實(shí)現(xiàn)方法籠罩。當(dāng)參數(shù)個(gè)數(shù)不一致,那么會(huì)報(bào)錯(cuò)(這就牽扯到上面說(shuō)所得方法重載)。當(dāng)方法名字不一致,就不會(huì)籠罩,只是子類新定義的方法。;
其次點(diǎn),這是php這些語(yǔ)言設(shè)計(jì)時(shí)的規(guī)定吧。我是這么理解的是訪問(wèn)高一層的東西對(duì)比輕易,假設(shè)再去訪問(wèn)底層的東西權(quán)限斷定要高一些。
看代碼:
classpeople
protectedfunctionsing
echo人唱歌;
classwomanextendspeople
publicfunctionsing
echo女人唱歌;
$woman1=newwoman;
$woman1-sing;
PHP面向?qū)ο缶幊讨钊肜斫夥椒?/p>
這樣很正常的可以輸出"女人唱歌'。但當(dāng)把woman里的sing方法改為proctcted,父元素改成public時(shí),即將父類的訪問(wèn)權(quán)限設(shè)置的大于子類后,就會(huì)報(bào)下面的錯(cuò)誤。
第三點(diǎn),是要求參數(shù)和名字一樣,概括就是要求參數(shù)的個(gè)數(shù)與父類一致,而并不是參數(shù)名稱一致。即傳遞的參數(shù)名字可以為任意,只要保證傳遞的個(gè)數(shù)一致即可。
以上內(nèi)容簡(jiǎn)樸介紹了PHP語(yǔ)言中多態(tài)的兩個(gè)實(shí)現(xiàn)。
PS:重寫、籠罩、重載、多態(tài)幾個(gè)概念的識(shí)別分析
override-重寫=籠罩、overload-重載、polymorphism-多態(tài)
override是重寫(籠罩)了一個(gè)方法,以實(shí)現(xiàn)不同的功能。一般是用于子類在繼承父類時(shí),重寫(重新實(shí)現(xiàn))父類中的方法。
重寫(籠罩)的規(guī)矩:
1、重寫方法的參數(shù)列表務(wù)必完全與被重寫的方法的一致,否那么不能稱其為重寫而是重載.
2、重寫方法的訪問(wèn)修飾符確定要大于被重寫方法的訪問(wèn)修飾符(publicprotecteddefaultprivate)。
3、重寫的方法的返回值務(wù)必和被重寫的方法的返回一致;
4、重寫的方法所拋出的奇怪務(wù)必和被重寫方法的所拋出的奇怪一致,或者是其子類;
5、被重寫的方法不能為private,否那么在其子類中只是新定義了一個(gè)方法,并沒(méi)有對(duì)其舉行重寫。
6、靜態(tài)方法不能被重寫為非靜態(tài)的方法(會(huì)編譯出錯(cuò))。
overload是重載,一般是用于在一個(gè)類內(nèi)實(shí)現(xiàn)若干重載的方法,這些方法的名稱一致而參數(shù)形式不同。
重載的規(guī)矩:
1、在使用重載時(shí)只能通過(guò)一致的方法名、不同的參數(shù)形式實(shí)現(xiàn)。不同的參數(shù)類型可以是不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)依次(參數(shù)類型務(wù)必不一樣);
2、不能通過(guò)訪問(wèn)權(quán)限、返回類型、拋出的奇怪舉行重載;
3、方法的奇怪類型和數(shù)目不會(huì)對(duì)重載造成影響;
多態(tài)的概念對(duì)比繁雜,有多種意義的多態(tài),一個(gè)好玩但不嚴(yán)謹(jǐn)?shù)恼f(shuō)法是:繼承是子類使用父類的方法,而多態(tài)那么是父類使用子類的方法。
一般,我們使用多態(tài)是為了制止在父類里大量重載引起代碼臃腫且難于維護(hù)。
舉個(gè)例子:
publicclassShape
publicstaticvoidmainString[]args
Triangletri=newTriangle;
System.out.printlnTriangleisatypeofshape?+tri.isShape;//繼承
Shapeshape=newTriangle;
System.out.printlnMyshapehas+shape.getSides+sides.;//多態(tài)
RectangleRec=newRectangle;
Shapeshape2=Rec;
System.out.printlnMyshapehas+shape2.getSidesRec+sides.;//重載
publicbooleanisShape
returntrue;
publicintgetSides
return0;
publicintgetSidesTriangletri//重載
return3;
publicintgetSidesRectan
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動(dòng)合同范本題目
- 農(nóng)村水田租賃承包合同范本
- 企業(yè)汽車銷售合同范本
- 代理買賣二手車合同范本
- 代領(lǐng)購(gòu)房合同范本
- 一般經(jīng)銷合同范例
- 個(gè)人購(gòu)貨采購(gòu)合同范本
- 關(guān)于裝修貸款合同范本
- 升旗臺(tái)合同范本
- 前臺(tái)勞務(wù)派遣合同范本
- X證書失智老年人照護(hù)身體綜合照護(hù)講解
- 2025勞動(dòng)合同法重點(diǎn)法條導(dǎo)讀附案例詳解
- 2025年內(nèi)蒙古自治區(qū)政府工作報(bào)告測(cè)試題及參考答案
- 2024年全國(guó)中學(xué)生生物學(xué)聯(lián)賽試題及答案詳解
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)服務(wù)平臺(tái)建設(shè)合同2篇
- 2025年度花卉產(chǎn)業(yè)大數(shù)據(jù)平臺(tái)建設(shè)合同3篇
- 魚骨圖培訓(xùn)課件
- 小學(xué)班會(huì)-交通安全伴我行(共25張課件)
- 建筑施工現(xiàn)場(chǎng)安全警示(案例)
- 《生產(chǎn)與運(yùn)作管理 第4版》課件 第1、2章 概論、需求預(yù)測(cè)與管理
- 護(hù)理禮儀與人文關(guān)懷
評(píng)論
0/150
提交評(píng)論