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'
在最后一个示例中,toOverridePrivate
在 A
的范围内不可访问,尽管 $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
总是不可访问的。
当 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'
在最后一个示例中,toOverridePrivate
在 A
的范围内不可访问,尽管 $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
总是不可访问的。