PHP類方法重寫原則

來源:互聯網
上載者:User
可能我們日常工作中很少用到這塊知識點,但我還是喜歡把遇到的卻不清楚的知識點摸清

PHP的類方法重寫規則

1、final修飾的類方法不可被子類重寫

final修飾的類方法不可被子類重寫 即便final private方法無法被繼承 子類仍不能對齊進行重寫

class FinalMethod{    //可繼承不可重寫    final public function finalPublic()    {        echo "can be inherited, but be overrided";    }    //可繼承不可重寫    final protected function finalProtected()    {        echo "can be inherited, but be overrided";    }    //不可繼承不可重寫 雖然子類繼承不到父類的private方法 但同時也會被final限制無法重寫    final private function finalPrivate()    {        echo "can not be inherited or be overrided";    }    //雖然不可繼承 但子類裡可重寫此方法    private function private()    {        echo "can not be inherited ,but be overrided";    }} class Override extends FinalMethod{    //error    public function finalPublic()    {     }    //error    protected function finalProtected()    {    }    //error    private function finalPrivate()    {    }    //correct    public/protected/private function private()    {        //子類繼承父類重寫父類方法時存取層級只能更加寬鬆 不可更為嚴格    }}

2、PHP是否重寫父類方法只會根據方法名是否一致判斷(5.3以後重寫父類方法參數個數必須一致)

這裡並不是說方法參數無任何作用 PHP無重載機制 所以判斷是不是重寫只會通過方法名(C/C++不僅要方法名相同,參數也相同時才被視為重寫,否則即為重載,即新定義了一個多態函數的態) 當方法名相同時即被認為是在重寫父類方法,5.2可以參數不同,5.3以後參數需和父類方法一致,且都追尋繼承存取層級的規則。

class Father{    public function index($args_1)    {    }} class Child extends Father{    //5.3以後重寫方法必須與父類保持參數個數相同    public function index($args_1, $args_2)    {        //在C/C++中此為重載非重寫,因為C/C++具有標準的多態機制,會因參數不同而視為某一方法的另一種態        //but在php中此依然為重寫 但5.3以後此為非法 必須與父類的方法參數個數保持一致    }    //5.3以後重寫方法必須與父類保持參數個數相同    private function index($args_1, $args_2)    {        //C/C++會因為參數不同於父類方法而視為重載,即新定義了一個函數的態,所以不會受到繼承存取權限的限制        //但php仍然會被視為對父類方法的重寫,會受到繼承存取權限的升降規則限制    }}

3、重寫時存取層級只可以等於或者寬鬆於父類 不可提升存取層級

父類的public方法不能被子類重寫為protected或者private,protected方法不能被重寫為private,可以寬鬆er,不可以嚴格er

class Father{    public function index()    {    }} class Child extends Father{    protected/private function index()    {       //存取權限提升 錯誤        //父類為public 則子類重寫也只能為public       //父類為protected 則子類可為public/protected       //父類為private 則子類public/protected/private皆可    }}

其實關於存取層級繼承規則有很多有趣的地方

private在我們常識中是無法被繼承的,子類拿不到,但其存取層級已是最高,所以你在子類中可以寫成private protected public 彷彿是我們自己重新定義了一個函數一樣,這點在5.2版本之前尤其突出,因為5.2之前的版本在繼承重寫父類方法是可以不保持參數個數相同,但5.3以後加強了這方面的限制,參數個數必須與父類相同

註:

子類實現父類的抽象方法或某類實現介面的方法時其實仍屬於繼承關係,仍追尋訪問等級只能降低不可提升的規則, 而且抽象方法不可被聲明為private,abstract修飾的方法肯定是用於繼承實現的,所以只能是public或者protected 介面的方法聲明必須為public,interface裡聲明的方法也肯定是被繼承實現的,且只能是public, implements 此介面的類也指定重寫成public類型的方法

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.