0

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

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

注意,自我::$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一个得到getValfrom class A,但似乎得到了 class 中定义的值B

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

4

1 回答 1

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函数时,BPHP 在其父类中找到它的声明,该父$c类使用 operator 返回当前类的值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,这意味着返回调用它的类的变量的值。

于 2017-03-20T15:57:28.393 回答