为什么在后期静态绑定子类中从父方法和当前方法获取数据

时间:2017-03-20 15:48:48

标签: php oop late-static-binding

好的,标题很难理解,但我试图了解后期静态绑定,我看到了这个答案https://stackoverflow.com/a/35577069/1640606

这显示了这两个例子之间的区别:

注意, self :: $ c

class A
{
    static $c = 7;

    public static function getVal()
    {
        return self::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 7

延迟静态绑定,请注意 static :: $ c

class A
{
    static $c = 7;

    public static function getVal()
    {
        return static::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 8

现在,我理解这一点,但我没有得到的是,为什么B::getVal(); // 8首先从类getVal获取A,但似乎得到了类中定义的值B

所以,``B :: getVal();`是获取类的方法,但是第二类的值。我的问题是,这是后期静态绑定的真正预期目的,它有助于解决

1 个答案:

答案 0 :(得分:1)

示例1:

class A
{
    static $c = 7;

    public static function getVal()
    {
        return self::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 7

在示例1中,它返回7,因为当您在getVal上调用B函数时,PHP在其父类中查找其声明,该父类从当前类返回$c的值使用运算符self

示例2:

class A
{
    static $c = 7;

    public static function getVal()
    {
        return static::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 8

但是在示例2中,当您调用getVal时,php再次在其父类中找到它的声明,但是类返回return static::$c,这意味着返回调用它的类变量的值