日常業務でこのナレッジ ポイントを使用することはほとんどないかもしれませんが、私は今でも、遭遇したものの不明なナレッジ ポイントを調べるのが好きです。
PHP のクラス メソッドの書き換えルール
1. 最終的に変更されたクラス メソッドはサブクラスでオーバーライドできません。たとえ最終的なプライベート メソッドがサブクラスで継承できない場合でも、整列して書き換えることはできません。
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 にはオーバーロード機構がありません。したがって、オーバーライドされるかどうかはメソッド名によってのみ判断されます (C/C++ はメソッド名が同じであるだけでなく、書き換えとみなされるパラメータも同じである必要があります。それ以外の場合はオーバーロードとなります)。 、ポリモーフィック関数の状態が新たに定義されます)
class Father{ public function index($args_1) { }}class Child extends Father{ public function index($args_1, $args_2) { //在C/C++中此为重载非重写,因为C/C++具有标准的多态机制,会因参数不同而视为某一方法的另一种态 //but在php中此依然为重写 } private function index($args_1, $args_2) { //C/C++会因为参数不同于父类方法而视为重载,即新定义了一个函数的态,所以不会受到继承访问权限的限制 //但php仍然会被视为对父类方法的重写,会受到访问权限的控制 }}
3. 書き換える際のアクセスレベルは親クラスと同等かそれより緩いもののみであり、アクセスレベルを上げることはできません。つまり、親クラスの public メソッドをサブクラスによって protected または private として書き換えることはできません。また、protected メソッドを厳密 er
class Father{ public function index() { }}class Child extends Father{ protected/private function index() { //访问权限提升 错误 //父类为public 则子类重写也只能为public //父类为protected 则子类可为public/protected //父类为private 则子类public/protected/private皆可 }}