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