1. 程式人生 > >PHP面向物件(三):繼承與多型

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雖然多型體現模糊,但還是具有多型特性的