PHP - 私有 parent 方法 "overridden" 如果 child 有它的实现?

PHP - Is a private parent method "overridden" if child has an implementation of it?

当 child 具有私有 parent 方法的实现时,有几个关于奇怪行为的问题,如下例所示:

class A {
    private function toOverridePrivate() {
        echo "private toOverridePrivate A\n";
    }

    public function callInA() {
        $this->toOverridePrivate();
        echo "\n";
    }
}

class B extends A {
    private function toOverridePrivate() {
        echo "private toOverridePrivate B\n";
    }  

    public function callInB() {
        $this->toOverridePrivate();
        echo "\n";
    }      
}

$a = new A;
$b = new B;

$a->callInA(); // private toOverridePrivate A

$b->callInA(); // private toOverridePrivate A
$b->callInB(); // private toOverridePrivate B

调用 $b->callPrintsInA() 时,A 会调用 toOverridePrivate 的实现,因为 B::toOverridePrivate 无法从 A 访问。

总而言之,该方法必须可以从它被调用的范围访问,因此以下失败:

class A {
    public function callInA() {
        $this->toOverridePrivate();
        echo "\n";
    }
}

class B extends A {
    private function toOverridePrivate() {
        echo "private toOverridePrivate B\n";
    }     
}

$b = new B;

$b->callInA(); // ERROR: Call to private method B::toOverridePrivate() from context 'A'

在最后一个示例中,toOverridePrivateA 的范围内不可访问,尽管 $this 实际上是类型 [=25] 的 object =].


但是答案之间存在差异的一个方面是,如果在 overriding[=60= 中的 child class 中有另一个私有 parent 方法的实现].在我能找到的最受欢迎的问题中,"Strange behavior when overriding private methods" the accepted answer 说它压倒了...

Now if you override the private method, its new scope will not be A, it will be B

...而 second most voted answer 指出...

A private method is not overridable

...因为它在其 class 范围之外是未知的。


最后的陈述是有问题的,因为声明私有方法 final 使得 覆盖 它不可能与它不能被覆盖的确切消息:

class A { 
    final private function someMethod() { } 
}

class B extends A { 
    // Fatal error: Cannot override final method A::someMethod()
    private function someMethod() { } 
}

所以...

1。如果 child class 覆盖 私有 parent 方法,如果它有该方法的实现?

2。如果这不是压倒一切,你会用什么词汇来描述它?

子 class 根本不知道父 class 的任何私有方法。 child class 范围内的任何此类方法都是未定义的。如果一开始就没有定义,就不能被覆盖。

如果方法是public,那么它对所有人可见,任何代码都可以调用它。当方法受保护时,只有 class 本身及其任何后代知道。当一个方法是私有的时,它只在这个 class 的范围内是已知的。对于任何其他 class,此方法只是未定义。
您可以在子 class 中定义另一个具有相同名称的方法,但它不会覆盖任何内容。您仍然可以将其称为重写,但意义不大。覆盖意味着如果您不在子 class 中重新定义方法,它将调用父 class 中的定义。使用私有方法是不可能的,因为子 class 无法访问它们。

考虑这个例子:

class A {
    private function toOverridePrivate() {
        echo "private toOverridePrivate A\n";
    } 
}

class B extends A {
    public function toOverridePrivate() {
        parent::toOverridePrivate();
    }   
}

$o = new B;

$o->toOverridePrivate();

Fatal error: Uncaught Error: Call to private method A::toOverridePrivate() from context 'B'

无论class B是否定义方法toOverridePrivate,都没有区别,因为A的方法toOverridePrivate总是不可访问的。