ホームページ >バックエンド開発 >PHPの問題 >PHP クラスメソッドの書き換え原則とは何ですか?

PHP クラスメソッドの書き換え原則とは何ですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-10-30 15:30:432156ブラウズ

PHP クラス メソッド書き換えの原則: 1. 最終的に変更されたクラス メソッドはサブクラスによってオーバーライドできません; 2. PHP が親クラス メソッドを書き換えるかどうかは、メソッド名が一致しているかどうかに基づいてのみ判断されます; 3. 書き換え中のアクセスレベルは親クラスと同じか、それよりも緩やかなレベルのみにすることができ、アクセス レベルを上げることはできません。

PHP クラスメソッドの書き換え原則とは何ですか?

PHP クラス メソッドの書き換え原則:

1. Final によって変更されたクラス メソッドをサブクラス化することはできません。

最終的に変更されたクラス メソッドはサブクラスでオーバーライドできません。最終的なプライベート メソッドがサブクラスで継承できない場合でも、整列で書き換えることはできません

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. オーバーライドする場合、アクセス レベルは親クラスと同じか、親クラスよりも緩くすることができ、上げることはできません。

親クラスのパブリック メソッドサブクラスまたはプライベートによって保護されたものとしてオーバーライドすることはできません。保護されたメソッドはプライベートとして書き換えることはできません。厳格ではなく、より緩やかにすることができます

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.3 以降はこの領域の制限が強化され、パラメータの数は同じでなければなりません。親クラスとして

#注:

サブクラスが親クラスの抽象メソッドまたはインターフェイスを実装する特定のクラスのメソッドを実装する場合、それは依然として継承関係にあります。アクセス レベルはルールを下げることしかできませんが、改善することはできません

および

抽象メソッドはプライベートとして宣言できません。抽象的に変更されたメソッドは継承によって実装する必要があるため、パブリックまたは保護のみにすることができます. インターフェイス内のメソッド宣言は public である必要があります。インターフェイス内で宣言されたメソッドも継承によって実装する必要があり、継承によってのみ実装できます。パブリック、実装されます。このインターフェイスのクラスは、パブリック型として書き換えられるメソッドも指定します

関連ビデオの推奨:PHP プログラミングの入門から習熟まで

以上がPHP クラスメソッドの書き換え原則とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。