Php 为什么在后期静态绑定中,子类从父类和当前方法获取数据
好的,标题很难理解,但我试图理解后期静态绑定,我看到了这个答案 这显示了这两个示例之间的差异: 注意,self::$cPhp 为什么在后期静态绑定中,子类从父类和当前方法获取数据,php,oop,late-static-binding,Php,Oop,Late Static Binding,好的,标题很难理解,但我试图理解后期静态绑定,我看到了这个答案 这显示了这两个示例之间的差异: 注意,self::$c class A { static $c = 7; public static function getVal() { return self::$c; } } class B extends A { static $c = 8; } B::getVal(); // 7 后期静态绑定,注意静态::$c class A
class A
{
static $c = 7;
public static function getVal()
{
return self::$c;
}
}
class B extends A
{
static $c = 8;
}
B::getVal(); // 7
后期静态绑定,注意静态::$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
首先从类A
获取getVal
,但似乎获取了类B
中定义的值
所以,`B::getVal();`正在获取类的方法,但获取第二个类的值。我的问题是,这是后期静态绑定的真正目的吗?它有助于解决什么问题
class A
{
static $c = 7;
public static function getVal()
{
return self::$c;
}
}
class B extends A
{
static $c = 8;
}
B::getVal(); // 7
class A
{
static $c = 7;
public static function getVal()
{
return static::$c;
}
}
class B extends A
{
static $c = 8;
}
B::getVal(); // 8
在示例1中,它返回您7,因为当您在B
上调用getVal
函数时,PHP在其父类中找到它的声明,该父类使用运算符self
从当前类返回$c
的值
示例2:
class A
{
static $c = 7;
public static function getVal()
{
return self::$c;
}
}
class B extends A
{
static $c = 8;
}
B::getVal(); // 7
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
,这意味着返回调用它的类的变量的值。答案在php手册的“现在,我理解这一点,但是”…但这正是示例试图展示的具体点。那么…您对自己给出的示例了解多少?要回答您自己的问题,只需问自己:在运行时,那么当--B::getVal()`实际上是调用的,静态::$c
实际解析为什么?self:$c或$this->c
会解析为什么呢?@arkascha嗯,在我不理解后期静态绑定的含义之前,或者如果可能的话,父类可以“放弃”返回子属性,即使存在相同的属性。But、 我不确定这个“特性”是否就是我们所说的后期静态绑定?如果是,父类忽略它自己的属性并返回一个子属性有什么意义。在类和特征中,它是不同的。你对如何理解这一点有错误的方法。父类没有“忽略”“什么都行。实际上,类从来不会做任何事情,它是被动的,只有对象的方法做静态类的事情或函数。从这样一个方法的角度来看,这里是B::getVal()
:它在哪个类上被调用?右,在B
上。该类的$c
的静态值是多少?对的啊,所以static
意味着(在本文中)“返回调用它的类的变量的值”,正如您所说的。嗯,那个“静态”让我很困惑。如果它是“返回原点::$c
”,对我来说会更有意义,但如果你删除了所有“静态”的东西,并用对象替换它,(新B)->getVal()代码>它仍然显示8。如果这可以在没有静态方法、属性的情况下完成。。。那么,为什么这些示例被命名为“静态”绑定呢?我认为这个特性只适用于静态范围,即:
如果您删除所有静态范围,那么它显然会尝试返回调用它的变量的值。像$this
d但是在那种情况下,它应该回显7
,因为getVal
是在类A
中定义的,类A
s属性$c
的值为7,但您已经创建了类B的对象,这就是为什么它首先尝试从类B中获取变量值,如果在那里没有定义,那么它会像其他编程一样从类A中尝试语言