Ответ 1
Лучшим способом решения этой проблемы является обновление до PHP 5.3, где поздние статические привязки. Если это не вариант, вам, к сожалению, придется перепроектировать ваш класс.
<?php
class Base {
protected static $c = 'base';
public static function getC() {
return self::$c;
}
}
class Derived extends Base {
protected static $c = 'derived';
}
echo Base::getC(); // output "base"
echo Derived::getC(); // output "base", but I need "derived" here!
?>
Итак, какое лучшее обходное решение?
Лучшим способом решения этой проблемы является обновление до PHP 5.3, где поздние статические привязки. Если это не вариант, вам, к сожалению, придется перепроектировать ваш класс.
Основываясь на демесе и входе Undolog: Undolog прав, для PHP <= 5.2.
Но с 5.3 и поздними статическими привязками он будет работать, просто используйте static вместо self внутри функции - теперь он будет работать...//спасибо @deceze для подсказки
для нас скопируйте предыдущие образцы сканированных пользователей stackoverflow - это будет работать:
class Base {
protected static $c = 'base';
public static function getC() {
return static::$c; // !! please notice the STATIC instead of SELF !!
}
}
class Derived extends Base {
protected static $c = 'derived';
}
echo Base::getC(); // output "base"
echo Derived::getC(); // output "derived"
Вы должны повторно применить метод базового класса; попробуйте:
class Derived extends Base {
protected static $c = 'derived';
public static function getC() {
return self::$c;
}
}
Как вы видите, это решение очень бесполезно, потому что принудительно переписать все подклассы.
Значение self::$c
зависит только от класса, в котором метод фактически реализован, а не от класса, из которого он был вызван.