Переопределение статических членов в производных классах в 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 зависит только от класса, в котором метод фактически реализован, а не от класса, из которого он был вызван.