B->echoExtendedStaticVariable() == 'A'
потому что self::
оценивается в время компиляции , а не время выполнения. Это как если бы вы написали A::
вместо self::
.
Вам нужна функция, называемая «поздняя статическая привязка» - она «поздняя», потому что она может определять класс во время выполнения, а не во время компиляции.
Вы можете эмулировать это (вроде) в PHP 5.2, используя 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
статическим методом и ожидать, что это сработает.