Php,继承,后期静态绑定,意外调用链

时间:2015-04-26 10:00:32

标签: php oop

考虑这段代码:

class C
{
    public function get()
    {
        echo 'C';
        static::get();
    }

    public function save()
    {
        self::get();
    }
}

class B extends C
{
    public function get()
    {
        echo 'B';
        static::get();
    }
}

class A extends B
{
    public function get()
    {
        echo 'A';
    }
}

$x = new A();
$x->save();

它在预期CA

时回应CBA

1 个答案:

答案 0 :(得分:1)

为了让它以您想要的方式工作,请反转逻辑 - 让您的保存调用static::get(),以便它将从继承树的顶部开始;并在回显自己的输出之前,在树中的每个继承类中使用对parent::get()的调用(基本级别除外)

class C
{
    public function get()
    {
        echo 'C';
    }

    public function save()
    {
        static::get();
    }
}

class B extends C
{
    public function get()
    {
        parent::get();
        echo 'B';
    }
}

class A extends B
{
    public function get()
    {
        parent::get();
        echo 'A';
    }
}

$x = new A();
$x->save();

Demo