好的,标题很难理解,但我试图了解后期静态绑定,我看到了这个答案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();`是获取类的方法,但是第二类的值。我的问题是,这是后期静态绑定的真正预期目的,它有助于解决
答案 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
,这意味着返回调用它的类变量的值