PHP構造方法和析構方法在繼承中的表現
覆蓋(override)——重寫
工具/原料
PHP構造方法和析構方法在繼承中的表現 覆蓋(override)——重寫
PHP構造方法和析構方法在繼承中的表現
1,子類中如果沒有構造方法,則子類在例項化的時候,會自動呼叫父類構造方法(如果有);
1.1,推論:此時,子類例項化時的實參,需要按照父類構造方法的對應形參給定;
2,子類中如果沒有析構方法,則子類在被銷燬的時候,會自動呼叫父類析構方法(如果有);
3,如果子類有構造方法,則不會自動呼叫父類構造方法,但我們可以在其中手動呼叫:parent::__construct()
4,如果子類有析構方法,則不會自動呼叫父類析構方法,但我們可以在其中手動呼叫:parent::__destruct()
下面演示自動呼叫父類構造方法的情形:
類和物件的訪問總結圖:
覆蓋(override)——重寫
含義:
一個子類繼承了父類的特徵資訊(私有的繼承不了),但又自己來重新定義父類繼承給自己的特徵資訊,這種現象就稱為“覆蓋”(重寫)——override。
先考察一個下級使用上級類顯示資訊而不“完全”的例子:
於是,我們在子類中,“親自”來定義一個顯示資訊的方法,該方法跟父類的方法同名:
(同名的目的可以認為“做同樣的事情”):
該程式碼明顯有2行是跟父類的同名方法所做的事情是一樣的,則改進如下:
總結:
只要在(設計)下級類的時候,認為上級類給自己的屬性或方法“不夠好”(不夠自己所需),就可以重新定義這些屬性或方法,就構成了“重寫”。
重寫的基本要求:
訪問控制權限:下級類重寫上級類的同名屬性或方法時,所使用的訪問控制修飾符“不能更狹小”,即:
上級是public,下級只能是public
上級是protected,下級只能是protected和public
上級是private,下級:此時覆蓋不了,
方法覆蓋的時候,下級方法的引數要求跟上級方法的引數“一致”:
特例:構造方法也可以重寫,但此時不要求引數一致。
私有屬性和私有方法的重寫問題:私有屬性和方法都不能覆蓋,但其實子類可以定義跟父類私有的同名屬性或方法。只是當作一個自身的新的屬性或方法來看待而已
可見:
父類的p1(public屬性)和p2(protected屬性)都被子類覆蓋率。
而:
父類的p3(private屬性)並沒有被覆蓋,雖然在類中不能使用。
同時,子類中可以定義出自己的p3屬性。