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之前执行?
答案 0 :(得分:6)
B->echoExtendedStaticVariable() == 'A'
因为self::
在编译时进行评估,而非运行时。就好像你写了A::
而不是self::
。
你想要的是一个名为“后期静态绑定”的功能 - 它是“迟到的”,因为它可以在运行时而不是在编译时确定类。
您可以使用ReflectionClass
:
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)。