Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
为什么';PHP5.3中的变量静态绑定工作是否很晚?_Php_Variables_Inheritance_Static_Late Static Binding - Fatal编程技术网

为什么';PHP5.3中的变量静态绑定工作是否很晚?

为什么';PHP5.3中的变量静态绑定工作是否很晚?,php,variables,inheritance,static,late-static-binding,Php,Variables,Inheritance,Static,Late Static Binding,让我们从一些代码开始: class Super { protected static $color; public static function setColor($color){ self::$color = $color; } public static function getColor() { return self::$color; } } class ChildA extends Super { }

让我们从一些代码开始:

class Super {

    protected static $color;

    public static function setColor($color){
        self::$color = $color;
    }

    public static function getColor() {
        return self::$color;
    }

}

class ChildA extends Super { }

class ChildB extends Super { }

ChildA::setColor('red');
ChildB::setColor('green');

echo ChildA::getColor();
echo ChildB::getColor();

现在,PHP5.3中使用static关键字的后期静态绑定对于静态方法非常有效,因此我假设它对静态变量也会起到同样的作用。嗯,看来不是。上面的例子并没有像我最初预期的那样先打印“红色”再打印“绿色”,而是打印“绿色”和“绿色”。当它在方法上工作时,为什么它在变量上不工作?有没有其他方法可以达到我预期的效果?

后期静态绑定只适用于变量/方法的新定义。因此,在您的示例中,
Super
$color
属性将始终被修改,而不是
ChildA
ChildB
。要使用后期静态绑定,需要使用
static
关键字,而不是
self
。此外,您需要重新定义
ChildA
ChildB
类的
$color
属性:

class Super {

    protected static $color;

    public static function setColor($color){
        // static instead of self
        static::$color = $color;
    }

    public static function getColor() {
        // static instead of self
        return static::$color;
    }

}

class ChildA extends Super {
    protected static $color;
}
class ChildB extends Super {
    protected static $color;
}

ChildA::setColor('red');
ChildB::setColor('green');

echo Super::getColor(); // prints nothing (NULL = ''), expected
echo ChildA::getColor();// prints red
echo ChildB::getColor();// prints green

非常感谢,莱肯斯汀。这确实有点破坏了继承的舒适感,但我会设法:)谢谢这真的很有帮助。我也落入了同样的陷阱;我没有在子类中重新定义变量!你有没有关于这方面的文献,因为我似乎错过了PHP文档中的这一重要部分。