《PHP教程:PHP面向對象編程之深入理解方法重載與方法覆蓋(多態)》要點:
本文介紹了PHP教程:PHP面向對象編程之深入理解方法重載與方法覆蓋(多態),希望對您有用。如果有疑問,可以聯系我們。
什么是多態?
PHP教程
多態(Polymorphism)按字面的意思便是“多種狀態”.在面向對象語言中,接口的多種不同的實現方式即為多態.引用Charlie Calverts對多態的描述――多態性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自“Delphi4編程技術內幕”).簡單的說,便是一句話:允許將子類類型的指針賦值給父類類型的指針(沒錯這段話來自百度百科).那么多態的作用是什么,它有什么實際開發價值呢?在實際的應用開發中,采用面向對象中的多態主要在于可以將不同的子類對象都當作一個父類來處理,并且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化.
PHP教程
下面便是PHP中多態的兩個實現?
PHP教程
辦法重載(overload)
PHP教程
重載是類的多態的一種實現.函數重載指一個標識符被用作多個函數名,且能夠通過函數的參數個數或參數類型將這些同名的函數區分開來,調用不發生混淆.即當調用的時候,雖然辦法名字相同,但根據參數的不同可以自動調用相應的函數.
PHP教程
class A{ public function test(){ echo "test1"; } public function test($a){ echo "test2"; } } $a=new A(); $a->test(); $a->test($a);
假如php直接支持辦法重載的話.那么上面的例子執行后傳參和不傳參就會返回不同的值.然而php并不直接支持重載,這就意味著你如果直接按上面這樣定義的話,就會報錯的.會報什么錯呢?會報如下的錯誤.
PHP教程
?PHP教程
這意思便是不能重復定義A函數,報錯的行數也正是下面這行.PHP教程
public function test($a){
所以說php是并不直接支持重載的.合著說了這么半天php并不支持..別急,我說的是并不直接支持,所以說是我們可以讓php間接支持.這時候就要用到一個函數來支持重載了.就是__call().__call()辦法必須帶有兩個參數.第一個包含了被調用的辦法名稱,而第二個參數包含了傳遞給該辦法的參數數組.可以通過這個辦法實現類似于函數重載的功能.看下面的代碼.
PHP教程
public function __call($method,$p) { if($method=="display"){ if(is_object($p[0])){ $this->displayObject($p[0]); }else if(is_array($p[0])){ $this->displayArray($p[0]); }else{ $this->displayScalar($p[0]); } } } //下面是對上面定義的調用 $ov=new overload; $ov->display(array(1,2,3)); $ov->display('cat');
定義辦法的時候,可以看到有三個分支,如果一個對象傳遞給display()辦法,就調用的是displayObject()辦法;如果傳遞的是一個數組,調用displayArray();傳遞的是其他的內容的話,則調用的是displayScalar()辦法...可以看到下面調用時,第一個是傳遞了一個數組,則調用displayArray().第二個傳入的不是對象也不是數組,則屬于其他內容,調用的是displayScalar()辦法.所以這樣子就用__call()辦法實現了類似于其他語言的辦法重載.
PHP教程
辦法覆蓋(override)
PHP教程
所謂覆蓋,從本質上來說就是重寫.就是當子類繼承父類的一些辦法后,子類又在其內部定義了相同的辦法,則這個新定義的辦法會覆蓋繼承而來的父類的辦法,子類只能調用其內部定義的辦法.
PHP教程
有以下幾點要求:
PHP教程
1.當一個父類和子類有一個辦法,參數和名字完全一致,那么子類辦法會覆蓋父類的辦法.
PHP教程
2.在實行方法覆蓋的時候,拜訪修飾符可以是不一樣的,但是子類的拜訪范圍必須大于等于父類的拜訪范圍.
PHP教程
3.要求參數和名字一樣.并不是要求子類,父類名稱雷同.
PHP教程
下面是對這幾點的解釋:
PHP教程
第一點,必須參數一致,才會實現辦法覆蓋.當參數個數不一致,則會報錯(這就牽扯到上面說所得辦法重載).當辦法名字不一致,就不會覆蓋,只是子類新定義的辦法.;
PHP教程
第二點,這是php這些語言設計時的規定吧.我是這么理解的是拜訪高一層的東西比較容易,如果再去拜訪底層的東西權限肯定要高一些.
PHP教程
看代碼:PHP教程
class people{ protected function sing(){ echo "人唱歌"; } } class woman extends people{ public function sing(){ echo "女人唱歌"; } } $woman1=new woman(); $woman1->sing();
這樣很正常的可以輸出“女人唱歌”.但當把woman里的sing()方法改為proctcted,父元素改成public()時,即將父類的拜訪權限設置的大于子類后,就會報下面的錯誤.
PHP教程
?PHP教程
?第三點,是要求參數和名字一樣,具體便是要求參數的個數與父類相同,而并不是參數名稱一致.即傳遞的參數名字可以為任意,只要保證傳遞的個數相同即可.
PHP教程
以上內容簡單介紹了PHP語言中多態的兩個實現.PHP教程
PS:重寫、覆蓋、重載、多態幾個概念的區別闡發PHP教程
override->重寫(=籠罩)、overload->重載、polymorphism -> 多態
PHP教程
override是重寫(覆蓋)了一個辦法,以實現不同的功能.一般是用于子類在繼承父類時,重寫(重新實現)父類中的辦法.
重寫(覆蓋)的規則:PHP教程
?? 1、重寫方法的參數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.
?? 2、重寫方法的拜訪修飾符一定要大于被重寫方法的拜訪修飾符(public>protected>default>private).
?? 3、重寫的方法的返回值必須和被重寫的方法的返回一致;
?? 4、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;
?? 5、被重寫的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行重寫.
?? 6、靜態方法不能被重寫為非靜態的方法(會編譯出錯).
PHP教程
overload是重載,一般是用于在一個類內實現若干重載的辦法,這些辦法的名稱相同而參數形式不同.PHP教程
重載的規矩:PHP教程
?? 1、在使用重載時只能通過相同的方法名、不同的參數形式實現.不同的參數類型可以是不同的參數類型,不同的參數個數,不同的參數順序(參數類型必須不一樣);
?? 2、不能通過拜訪權限、返回類型、拋出的異常進行重載;
?? 3、方法的異常類型和數目不會對重載造成影響;
PHP教程
多態的概念比較復雜,有多種意義的多態,一個有趣但不嚴謹的說法是:繼承是子類使用父類的辦法,而多態則是父類使用子類的辦法.
PHP教程
一般,我們使用多態是為了避免在父類里大量重載引起代碼癡肥且難于維護.PHP教程
舉個例子:PHP教程
public class Shape { public static void main(String[] args){ Triangle tri = new Triangle(); System.out.println("Triangle is a type of shape? " + tri.isShape());// 繼承 Shape shape = new Triangle(); System.out.println("My shape has " + shape.getSides() + " sides."); // 多態 Rectangle Rec = new Rectangle(); Shape shape2 = Rec; System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重載 } public boolean isShape(){ return true; } public int getSides(){ return 0 ; } public int getSides(Triangle tri){ //重載 return 3 ; } public int getSides(Rectangle rec){ //重載 return 4 ; } } class Triangle extends Shape { public int getSides() { //重寫,實現多態 return 3; } } class Rectangle extends Shape { public int getSides(int i) { //重載 return i; } }
注意Triangle類的辦法是重寫,而Rectangle類的辦法是重載.對兩者比較,可以發現多態對重載的優點:
PHP教程
如果用重載,則在父類里要對應每一個子類都重載一個取得邊數的辦法;
PHP教程
假如用多態,則父類只提供取得邊數的接口,至于取得哪個形狀的邊數,怎樣取得,在子類里各自實現(重寫).PHP教程
維易PHP培訓學院每天發布《PHP教程:PHP面向對象編程之深入理解方法重載與方法覆蓋(多態)》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8164.html