ホームページ >バックエンド開発 >PHPの問題 >PHP で親クラスのメソッドをオーバーライドするときに注意すべき点は何ですか?

PHP で親クラスのメソッドをオーバーライドするときに注意すべき点は何ですか?

王林
王林オリジナル
2020-07-29 15:29:243778ブラウズ

PHP で親クラスのメソッドを書き換える場合は、次の点に注意してください: 1. Final キーワードで変更されたクラス メソッドはサブクラスによってオーバーライドできません; 2. PHP が親クラスのメソッドをオーバーライドするかどうかは、メソッド名が親クラスのメソッドであるかどうかに基づいてのみ判断されます。一貫性がある; 3. 書き換える場合、アクセス レベルは親クラスと同等かそれより緩いことしかできず、アクセス レベルを上げることはできません。

PHP で親クラスのメソッドをオーバーライドするときに注意すべき点は何ですか?

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

(推奨チュートリアル:

php グラフィック チュートリアル)

1. Final で変更されたクラス メソッドはサブクラスでオーバーライドできません

final で変更されたクラス メソッドはサブクラスでオーバーライドできません。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仍然会被视为对父类方法的重写,会受到继承访问权限的升降规则限制
    }
}

(ビデオ チュートリアルの推奨事項:

php ビデオ チュートリアル)

3. 書き換える場合、アクセス レベルは親クラスと同じか、親クラスよりも緩くすることができます。アクセス レベルを上げることはできません

親クラスのパブリック メソッドをサブクラスによって保護またはプライベートとしてオーバーライドすることはできません。また、保護されたメソッドをプライベートとしてオーバーライドすることもできません。

rree

以上がPHP で親クラスのメソッドをオーバーライドするときに注意すべき点は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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