Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么在后期静态绑定中,子类从父类和当前方法获取数据_Php_Oop_Late Static Binding - Fatal编程技术网

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

Php 为什么在后期静态绑定中,子类从父类和当前方法获取数据,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

好的,标题很难理解,但我试图理解后期静态绑定,我看到了这个答案

这显示了这两个示例之间的差异:

注意,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
{
    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中尝试语言