Переопределение статических членов в производных классах в PHP

<?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, где доступны поздние статические привязки . Если это не вариант, вам, к сожалению, придется перепроектировать ваш класс.

Основываясь на вкладе deceze и Undolog: Undolog прав, для PHP <= 5.2.

Но с 5.3 и поздними статическими привязками он будет работать, просто используйте static вместо self внутри функции – теперь он будет работать … // THX @ 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 зависит только от класса, в котором метод фактически реализован, а не от класса, из которого он был вызван.