Подтвердить что ты не робот

Переопределение статических членов в производных классах в 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!
?>

Итак, какое лучшее обходное решение?

4b9b3361

Ответ 1

Лучшим способом решения этой проблемы является обновление до PHP 5.3, где поздние статические привязки. Если это не вариант, вам, к сожалению, придется перепроектировать ваш класс.

Ответ 2

Основываясь на демесе и входе 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"

Ответ 3

Вы должны повторно применить метод базового класса; попробуйте:

class Derived extends Base {
  protected static $c = 'derived';

  public static function getC() {
    return self::$c;
  }
}

Как вы видите, это решение очень бесполезно, потому что принудительно переписать все подклассы.

Значение self::$c зависит только от класса, в котором метод фактически реализован, а не от класса, из которого он был вызван.