在PHP中,我時常會寫一個類,類寫了一個共用方法,然後讓子類去繼承就能得到對應的功能。假設大致上有這麼一個父類:
<?php class Father{ public function construct(){ echo '我是父类的构造方法!'; } protected function say($str = 'Hello World!'){ echo '说了一句话:' . $str; } } ?>
然後呢,搞一個子類去繼承他:
<?php class chirld extends Father{ public construct(){ echo '我是子类的构造方法~'; } }
此時你實例化子類,結果將會是我是子類別的建構方法~
!
當然,因為繼承
關係,所以子類別是可以呼叫父類別的say()
方法的。
如果你想實作父類別的建構方法,然而你又想實作子類別的建構方法,你可以這樣子去做:
<?php class chirld extends Father{ public construct(){ parent::construct(); echo '我是子类的构造方法~'; } } ?>
這時候就會輸出我是父類別的建構方法!
和我是子類別的建構方法~
。
假設你在子類別中定義了這麼一個方法:
protected function say($str = ''){ echo '我是子类的say'; }
那麼,你此時從父類別繼承下來的sys()
方法將會被重寫,所以呼叫後輸出的結果就是:我是子類別的say
。
如果你這樣定義會怎麼樣?
public function say($str = ''){ echo '我是子类的方法哦~'; }
這樣的寫法還是可以的。 PHP跟其他強類型語言不同的地方是,PHP重寫方法允許你對重寫的方法”向上公有化”,而不允許你”向下私有化”,就比如在這裡你定義為private
是肯定會報錯的,而像C++這樣語言確恰恰相反。
PHP的對於這種情況的想法是,你父親給了你受保護級別的遺產,此時在你手上是保護級別的,你父親允許你對對別人分享,也就是public
,但不允許你自己藏起來,也就是private
,自己獨吞肯定不行的。
此時你一定會問,那麼父類別的say()
設定為private
會怎麼樣?
結果不會怎樣,就是父類別已經私有化了,子類別根本繼承不到,所以你在子類別中的say()
方法隨你這麼定都可以。
還有一個問題,就是父類別已經定義了sys()
中帶可選參數,那麼,在子類別中的你像下面這樣無參數定義會怎麼樣呢?
public function say(){ echo '哈哈。我没有参数了耶~'; }
結果還是可以正常運作的,只不過會有 E_STRICT
等級的提示。原因在於PHP標準就是參數的數量必須跟父類別對齊,當然,可以在php.ini中進行錯誤等級設定。
以上是php類別的繼承用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!