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

时间:2018-08-25 22:54:02

标签: php oop inheritance private-methods late-static-binding

所以我一直在阅读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吗?据我所知,只有公共和受保护的属性才被复制到子类。我想念什么?

1 个答案:

答案 0 :(得分:1)

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

即。在该示例中,如果您尝试执行$b->foo(),它将仍然按预期失败。

这是我向自己解释的示例,可能会对其他人有所帮助

正在考虑B类。

$b->test()能够以A的公共成员身份访问foo()。

$this->foo()也在$b->test()内成功

$static::foo()之所以成功,是因为它正在从A中定义的test()调用A中定义的foo()版本。没有作用域冲突。

正在考虑B类。

在C类中覆盖foo()时, $c->test()当然仍然可以作为公共成员访问。

$c->test()中的$ this-> foo()作为A的私有成员可以访问。-很好。

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