PHP 方法覆蓋override 與 抽象方法的實現之間的關係

Overload重載:重載是多態的基礎,是方法名相同但根據參數不一樣作不一樣的處理,PHP是弱類型語言,不能直觀的實現方法重載ide

Override覆蓋:覆蓋是子類繼承父類方法並對齊進行從新構造,方法名相同即視爲覆蓋,且PHP5.3之後要求參數必須同父類相同,5.2之前能夠不一樣函數

覆蓋spa

可否覆蓋由final關鍵字決定,final方法即爲不可覆蓋方法,但同時受父類的訪問權限限制,覆蓋方法訪問權限不可高於父類code

實現對象

實現基於繼承,將父類中的抽象方法(沒有函數體的函數聲明)的方法功能實現出來,父類並無此方法的功能,子類必須有權限拿到才能去實現方法功能(函數體),因此實現父類的抽象方法必須可訪問到,父類抽象方法不可爲private繼承

一、父類某方法可否被子類重寫與此方法的訪問級別無關接口

public protected private對某方法內否被重寫沒有影響,可否被重寫要看此方法是否被final修飾(final類不可被繼承,final方法不可被重寫)io

二、但重寫方法要受到訪問級別的限制,即訪問權限不可提高規定function

(不單單是PHP,其餘面嚮對象語言依然適用),訪問權限只能夠下降,不能夠提高。class

三、PHP重寫父類方法時須要保持參數一致

雖然在 PHP 5.2 及之前沒有此限制但咱們仍是以最高標準爲原則,這也是風險控制的良好習慣,PHP並不會像C/C++同樣在子類與父類方法名相同參數不一致時認爲是對此方法的 多態重載,PHP沒有直接的重載機制,因此必須保持方法名相同參數相同

四、重寫不等於  實現  

實現是抽方法聲明或者接口方法聲明實現的場景,實現是繼承關係,繼承某抽象類or接口實現其方法,受訪問權限的制約

重寫並不須要訪問到,重寫是遠遠的站在子類中看父類的某個方法作一個本身的方法,不須要觸碰到;實現則不一樣,實現屬於繼承,需訪問到,這就是抽象方法不可被聲明爲private,接口比較特殊,必須爲public的緣由

不要與抽象類中的抽象方法或者接口中的接口方法混淆,抽象方法和接口中的方法皆爲方法聲明,咱們在子類繼承於此抽象類或接口中對其實現,此爲繼承關係,你給我,我才能夠去實現,因此抽象方法不可用private修飾,否則子類拿不到,而抽象方法又必須被子類繼承實現,死鎖了。

abstract class Abstract
{
    //抽象方法必須爲public protected 以使子類能夠有權拿到去實現功能
    //子類繼承此抽象類並實現所有的抽象法發 且追尋訪問權限的繼承規定(不可提高)
    
    abstract public function abstractPublicFunc();
    abstract protected function abstractProtectedFunc();
}

class Test extends Abstract
{
    public function abstractPublicFunc()
    {
        //權限不可提高 父類public因此這裏只能是public
    }
    
    public/protected function abstractProtectedFunc()
    {
        //權限不可提高 父類protected因此這裏不能爲private 但可爲protected或private
    }
}
class Father
{
    public function publicFunc()
    {
        //只能被重寫爲public
    }
    
    portected function protectedFunc()
    {
        //可重寫爲public/protected
    }
    
    private function privateFunc($args_1,$args_2....,$args_n)
    {
        //可重寫爲public/protected/private
    }
}

class Child
{
    public function publicFunc()
    {
        //訪問權限不可提高 只能爲public
    }
    
    public/portected function protectedFunc()
    {
        //訪問權限不可提高 可爲public/protected
    }
    //這裏加上與父類相同的參數是想證實能不能重寫和能否繼承無關 private方法依然可被子類重寫
    public/portected/private function privateFunc($args_1,$args_2....,$args_n)
    {
        //private已是最高訪問權限 因此public/protected/private均可以
    }
}
相關文章
相關標籤/搜索