<?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
?>
任何人都可以解释这里到底发生了什么?
为什么将foo()复制到B?
解决方法:
我现在记得为什么后期静态绑定很有用.不幸的是,PHP.net的例子很难解释.看到这个(修改过的)例子:
<?PHP
class A {
private function foo() {
echo __CLASS__;
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
public function foo()
{
echo __CLASS__;
}
}
$b = new B();
$b->test();
?>
如果你运行上面的代码,你会发现它有效,你会得到AB.为什么?
>它的工作原理是因为test()是foo()的公共getter,所以如果从类型A的对象调用test(),或者从类型B的对象调用继承自A的对象,则无关紧要,因为test( )将始终可以访问定义它的类的私有成员.
>在第一种情况下,$this-> foo();将始终调用A :: foo(),因为绑定是在A的范围内本地完成的,这有时是非常不受欢迎的.看到这个评论:http://www.php.net/manual/en/language.oop5.late-static-bindings.php#83502
>在第二种情况下,static :: foo();指示解释器确定$b的类型,并查看在哪个类中尝试查找foo().在这种情况下,B :: foo()被视为A :: foo()的覆盖方法,因此,基本上,如果B :: foo()存在,它将被调用,否则,解释器将查找A :: foo的().
>尝试将B :: foo()标记为私有并运行我提供的示例,以查看会发生什么.我认为这个测试和我上面的咆哮会为你澄清问题;)