PHP 5.3之前的静态继承

时间:2011-12-20 20:21:17

标签: 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"
}

为什么:

echo B::$v

打印“A”?

如何让它打印“B”?

有没有办法在PHP 5.3之前执行

2 个答案:

答案 0 :(得分: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

请注意,只有在有权访问实例时才能执行此操作,因此无法使echoExtendedStaticVariable成为静态方法,并希望此方法能够正常工作。

答案 1 :(得分:2)

在PHP 5.2中无法轻易做到这一点(即:没有明确覆盖每种方法)。

当您致电B::echoExtendedStaticVariable时,它会转发到A::echoExtendedStaticVariable,范围会更改为A,并且所有关于B的约束都将消失。没有回溯,没有反射,没有魔法常数,没有:它都指向A

在我看来,除非真的有必要,否则应该避免使用静态成员,而且情况很少。它使您的代码难以扩展,因为依赖注入是有限的,并且替换几乎是不可能的(除了模式,如Singleton)。