PHP面向物件(三):繼承與多型
1、繼承
繼承性:B類的物件擁有A類的全部屬性與行為,稱作B對A類的繼承。
好處:
1:提高了程式碼的複用性。
2:讓類與類之間產生了關係,提供了另一個特徵多型的前提
弊端:
打破了封裝性。對於一些類,或者類中功能,是需要被繼承,或者複寫的。
這時如何解決問題呢?介紹一個關鍵字,final:最終。
1)、final關鍵字
1:如果父類中的方法被宣告為 final,則子類無法覆蓋該方法。如果一個類被宣告為 final,則不能被繼承。
2:屬性不能被定義為 final,只有類和方法才能被定義為 final。
2)、PHP只能單繼承
1:繼承:不同於 Java 等語言,在 PHP 中,一個類只能直接從一個類中繼承資料,即單繼承。
2:使用 extends 關鍵字來定義類的繼承:class 子類 extends 父類{}
3)、三種訪問控制修飾符
public 表示全域性,本類內部,類外部,子類都可以訪問
protected 表示受保護的,只有本類或子類可以訪問
private 表示私有的,只有本類內部可以訪問
4)、過載與覆蓋的區別
函式的過載:發生在同一個類中,與什麼父類子類毫無關係,只是函式名相同,但引數(個數,型別)不同,他們之間毫無關係。
函式的覆蓋(重寫):發生在子類中,必須有繼承,父類被覆蓋時,函式名和引數要和父類中完全一樣。
5)、構造方法與析構方法
①、構造方法
1:構造方法是類中的一個特殊方法。當使用 new 操作符建立一個類的例項時,構造方法將會自動呼叫,其名稱必須是 __construct() 。
2:在一個類中只能宣告一個構造方法,而是隻有在每次建立物件的時候都會去呼叫一次構造方法,不能主動的呼叫這個方法,所以通常用它執行一些有用的初始化任務。該方法無返回值。
3:PHP 不會在本類中自動的呼叫父類的析構方法。要執行父類的構造方法,必須在子類的構造方法體中手動呼叫 parent::__construct() 。
作用一:初始化任務:
作用二:傳參
子類中呼叫父類的構造方法:parent::_construct();
②、析構方法:
1:與構造方法對應的就是析構方法,析構方法允許在銷燬一個類之前執行的一些操作或完成一些功能,比如說關閉檔案、釋放結果集等。解構函式不能帶有任何引數,其名稱必須是 __destruct() 。
2:和構造方法一樣,PHP 不會在本類中自動的呼叫父類的析構方法。要執行父類的析構方法,必須在子類的析構方法體中手動呼叫 parent::__destruct() 。
3:試圖在解構函式中丟擲一個異常會導致致命錯誤
析構方法是在物件被銷燬的時候,也可以手動銷燬一個物件:unset()
2、多型性:
面向物件的三大特性:封裝、繼承、多型。從一定角度來看,封裝和繼承幾乎都是為多型而準備的。這是我們最後一個概念,也是最重要的知識點。
1.定義: 所謂多型,就是指一個引用(型別)在不同的情況下的多種狀態。也可以理解為,多型是指通過指向父類的指標,來呼叫在不同子類中實現的方法。
2.多型存在的三個必要條件
一、要有繼承;
二、要有重寫;
三、父類引用指向子類物件。
【注】重寫:也就是覆蓋,子類中覆蓋父類的方法,函式名和引數都和父類的一樣。
1)、java 中的多型:
1.Java中多型的分類:
在java中,多型大致可以分為以下幾種情況:
1)person為父類,student為子類。那麼:person p =new student();
2)fliable為介面,bird為實現介面的類,那麼:fliable f =new bird();
3)fliable為抽象類,bird為繼承fliable的類,那麼:fliable f =new bird();
【案例】
2)、PHP中的多型
Php是弱型別語言,$obj可以是任何型別,上面通過一個關鍵字instanceof來判斷,變數指向的物件是否是animal類的一個例項,下面new cat(),new dog()都是animal子類的物件,而輸出了“dog say wangwang...”和“cat say miaomiao...”,說明子類物件是父類的一個例項,從而達到了java多型的功能。
至此,得出php雖然多型體現模糊,但還是具有多型特性的