提问者:小点点

php中私有方法的继承和后期静态绑定


所以我一直在阅读官方关于后期静态绑定的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吗?据我所知,只有公共和受保护的属性被复制到子类。我错过了什么?


共1个答案

匿名用户

也许注释“foo()将被复制到B”有点混乱或解释不正确。foo()对A来说仍然是私有的,只能从A中的方法访问。

即。在示例中,如果您尝试执行$b-

这是我向自己解释的例子,也许对别人有帮助:

考虑到B类。

$b-

$this-

$static::foo()成功,因为它正在调用A中定义的foo()版本,来自同样在A中定义的test()。没有范围冲突。

考虑到B类。

当foo()在C类中被覆盖时,$c-

并且在$c-

但是$static::foo()现在正在尝试从A访问,即C类中定义的foo()版本,因此失败了,因为它在C中是私有的。-根据错误消息。