ホームページ  >  記事  >  バックエンド開発  >  PHP クラスメソッドの書き換え原則

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

高洛峰
高洛峰オリジナル
2017-03-31 16:26:032128ブラウズ

日常の仕事でこのナレッジ ポイントを使用することはほとんどないかもしれませんが、私は今でも、遭遇したものの明確ではないナレッジ ポイントを見つけるのが好きです。

PHPクラス メソッドの書き換えルール

1、finalModificationサブクラスでオーバーライドできない

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

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++ は、メソッド名が同じでパラメーターも同じである場合にのみオーバーライドとみなされます。それ以外の場合はオーバーロード、つまりポリモーフィック です。 function 状態が新しく定義されます。) メソッド名が同じ場合、親クラスのメソッドを書き換えるとみなされます。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 としてオーバーライドすることはできません。保護されたメソッドをプライベートとしてオーバーライドすることはできず、緩和することもできます。厳密にはそうはできません

class Father
{
    public function index()
    {
    }
}
 
class Child extends Father
{
    protected/private function index()
    {
       //访问权限提升 错误 
       //父类为public 则子类重写也只能为public
       //父类为protected 则子类可为public/protected
       //父类为private 则子类public/protected/private皆可
    }
}

実際、アクセス レベルの継承ルールについては興味深いことがたくさんあります

私たちの常識ではプライベートは継承できません。サブクラスはそれを取得できませんが、そのアクセス レベルはすでに最高であるため、自分で関数を再定義したかのように、サブクラスを private protected public として記述することができます。これは、バージョン 5.2 より前では特に顕著です。これは、5.2 より前のバージョンではそうではないためです。親クラスのメソッドを継承およびオーバーライドする際には、パラメータの数を同じにする必要がありますが、5.3 以降、この領域のパラメータの数は親クラスのパラメータの数と同じでなければなりません。サブクラスが親クラスの抽象メソッドを実装するか、特定のクラスが

インターフェース

のメソッドを実装する場合、それは依然として継承関係にあり、アクセスは依然として追求されますが、レベルはアップグレードできないルールを下げることしかできず、抽象メソッドはアップグレードできません。抽象変更されたメソッドは継承の実装に使用する必要があるため、インターフェイスのメソッド宣言はパブリックである必要があり、インターフェイスで宣言されたメソッドはパブリックである必要があります。このインターフェイスを実装するクラスは、パブリック型として書き換えられるメソッドも指定します

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