PHP構造方法和析構方法在繼承中的表現?

PHP構造方法和析構方法在繼承中的表現

覆蓋(override)——重寫

工具/原料

PHP構造方法和析構方法在繼承中的表現 覆蓋(override)——重寫

PHP構造方法和析構方法在繼承中的表現

1,子類中如果沒有構造方法,則子類在例項化的時候,會自動呼叫父類構造方法(如果有);

1.1,推論:此時,子類例項化時的實參,需要按照父類構造方法的對應形參給定;

2,子類中如果沒有析構方法,則子類在被銷燬的時候,會自動呼叫父類析構方法(如果有);

3,如果子類有構造方法,則不會自動呼叫父類構造方法,但我們可以在其中手動呼叫:parent::__construct()

4,如果子類有析構方法,則不會自動呼叫父類析構方法,但我們可以在其中手動呼叫:parent::__destruct()

下面演示自動呼叫父類構造方法的情形:

PHP構造方法和析構方法在繼承中的表現 覆蓋重寫

類和物件的訪問總結圖:

PHP構造方法和析構方法在繼承中的表現 覆蓋重寫

覆蓋(override)——重寫

含義:

一個子類繼承了父類的特徵資訊(私有的繼承不了),但又自己來重新定義父類繼承給自己的特徵資訊,這種現象就稱為“覆蓋”(重寫)——override。

先考察一個下級使用上級類顯示資訊而不“完全”的例子:

PHP構造方法和析構方法在繼承中的表現 覆蓋重寫

於是,我們在子類中,“親自”來定義一個顯示資訊的方法,該方法跟父類的方法同名:

(同名的目的可以認為“做同樣的事情”):

PHP構造方法和析構方法在繼承中的表現 覆蓋重寫

該程式碼明顯有2行是跟父類的同名方法所做的事情是一樣的,則改進如下:

PHP構造方法和析構方法在繼承中的表現 覆蓋重寫

總結:

只要在(設計)下級類的時候,認為上級類給自己的屬性或方法“不夠好”(不夠自己所需),就可以重新定義這些屬性或方法,就構成了“重寫”。

重寫的基本要求:

訪問控制權限:下級類重寫上級類的同名屬性或方法時,所使用的訪問控制修飾符“不能更狹小”,即:

上級是public,下級只能是public

上級是protected,下級只能是protected和public

上級是private,下級:此時覆蓋不了,

方法覆蓋的時候,下級方法的引數要求跟上級方法的引數“一致”:

特例:構造方法也可以重寫,但此時不要求引數一致。

私有屬性和私有方法的重寫問題:私有屬性和方法都不能覆蓋,但其實子類可以定義跟父類私有的同名屬性或方法。只是當作一個自身的新的屬性或方法來看待而已

PHP構造方法和析構方法在繼承中的表現 覆蓋重寫

可見:

父類的p1(public屬性)和p2(protected屬性)都被子類覆蓋率。

而:

父類的p3(private屬性)並沒有被覆蓋,雖然在類中不能使用。

同時,子類中可以定義出自己的p3屬性。

構造方法, 析構,
相關問題答案