PHP面向?qū)ο缶幊讨钊肜斫夥椒╛第1頁(yè)
PHP面向?qū)ο缶幊讨钊肜斫夥椒╛第2頁(yè)
PHP面向?qū)ο缶幊讨钊肜斫夥椒╛第3頁(yè)
PHP面向?qū)ο缶幊讨钊肜斫夥椒╛第4頁(yè)
PHP面向?qū)ο缶幊讨钊肜斫夥椒╛第5頁(yè)
已閱讀5頁(yè),還剩3頁(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)介

本文格式為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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論