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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章