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之前有没有办法做到这一点?
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静态方法并希望此方法可以正常工作.