编程语言
首页 > 编程语言> > php 5.3中的后期静态绑定

php 5.3中的后期静态绑定

作者:互联网

请通过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
?> 

任何人都可以解释这里到底发生了什么?

为什么将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()标记为私有并运行我提供的示例,以查看会发生什么.我认为这个测试和我上面的咆哮会为你澄清问题;)

另外,我接受上述观点的任何评论,因为我在很长一段时间内都没有使用PHP.

标签:php-5-3,php
来源: https://codeday.me/bug/20190826/1728483.html