php 中私有方法的继承和后期静态绑定
Inheritance of a private method and Late Static Binding in php
所以我一直在阅读关于 Late Static Bindings 的官方 PHP 文档并遇到了一个令人困惑的示例:
<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
/* foo() will be copied to B, hence its scope will still be A and
* the call be successful */
}
class C extends A {
private function foo() {
/* original method is replaced; the scope of the new one is C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test(); //fails
?>
示例的输出:
success!
success!
success!
Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
有人可以解释为什么私有方法 foo() 被复制到 B 吗?据我所知,只有 public 和受保护的属性被复制到子 class。我错过了什么?
也许评论 "foo() will be copied to B" 有点令人困惑或解释不正确。 foo() 仍然是 A 私有的,只能从 A 中的方法访问。
即。在示例中,如果您尝试执行$b->foo()
,它仍然会按预期失败。
这是我自己解释的例子,也许对其他人有帮助:
考虑class B.
$b->test()
能够作为 A 的 public 成员访问 foo()。
$this->foo()
也在 $b->test()
内成功
$static::foo()
成功,因为它正在从也在 A 中定义的 test() 调用 A 中定义的 foo() 版本。没有范围冲突。
考虑class B.
当 foo() 在 class C 中被覆盖时,
$c->test()
当然仍然可以作为 public 成员访问,如果 A.
并且在 $c->test()
内 $this->foo() 可以作为 A 的私有成员访问。- 很好。
但是
$static::foo()
现在正在尝试从 A 访问,即 class C 中定义的 foo() 版本,因此失败,因为它在 C 中是私有的。- 根据错误消息。
所以我一直在阅读关于 Late Static Bindings 的官方 PHP 文档并遇到了一个令人困惑的示例:
<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
/* foo() will be copied to B, hence its scope will still be A and
* the call be successful */
}
class C extends A {
private function foo() {
/* original method is replaced; the scope of the new one is C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test(); //fails
?>
示例的输出:
success!
success!
success!
Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
有人可以解释为什么私有方法 foo() 被复制到 B 吗?据我所知,只有 public 和受保护的属性被复制到子 class。我错过了什么?
也许评论 "foo() will be copied to B" 有点令人困惑或解释不正确。 foo() 仍然是 A 私有的,只能从 A 中的方法访问。
即。在示例中,如果您尝试执行$b->foo()
,它仍然会按预期失败。
这是我自己解释的例子,也许对其他人有帮助:
考虑class B.
$b->test()
能够作为 A 的 public 成员访问 foo()。
$this->foo()
也在 $b->test()
$static::foo()
成功,因为它正在从也在 A 中定义的 test() 调用 A 中定义的 foo() 版本。没有范围冲突。
考虑class B.
当 foo() 在 class C 中被覆盖时,
$c->test()
当然仍然可以作为 public 成员访问,如果 A.
并且在 $c->test()
内 $this->foo() 可以作为 A 的私有成员访问。- 很好。
但是
$static::foo()
现在正在尝试从 A 访问,即 class C 中定义的 foo() 版本,因此失败,因为它在 C 中是私有的。- 根据错误消息。