PHP 5.3之前的静态继承

Ale*_*x V 3 php inheritance static php-5.3

class A
{
    static $v = "A";

    static function echoExtendedStaticVariable() {
        echo self::$v;
    }
}

class B extends A
{
    static $v = "B";
    // override A's variable with "B"
}
Run Code Online (Sandbox Code Playgroud)

为什么:

echo B::$v
Run Code Online (Sandbox Code Playgroud)

打印"A"?

我如何让它打印"B"?

在PHP 5.3之前有没有办法做到这一点

Fra*_*ila 6

B->echoExtendedStaticVariable() == 'A'因为self::编译时评估,而不是在运行时评估.就像你写的A::而不是self::.

你想要的是一个名为"后期静态绑定"的功能 - 它是"迟到的",因为它可以在运行时而不是在编译时确定类.

你可以使用ReflectionClass以下方法在PHP 5.2中模拟这种(排序):

class A
{
    static $v = "A";
    function echoExtendedStaticVariable() {
        $rc = new ReflectionClass($this);
        echo $rc->getStaticPropertyValue('v');
    }
}
class B extends A
{
    static $v = "B";
}
$b = new B();
$b->echoExtendedStaticVariable(); // B
Run Code Online (Sandbox Code Playgroud)

请注意,只有在有权访问实例时才能执行此操作,因此无法创建echoExtendedStaticVariable静态方法并希望此方法可以正常工作.