Переопределение статических членов в производных классах в PHP - PullRequest
12 голосов
/ 03 июля 2010
<?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!
?>

Так какой же лучший обходной путь?

Ответы [ 3 ]

9 голосов
/ 03 июля 2010

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

4 голосов
/ 17 января 2013

На основании данных Десезе и Ундолога: Ундолог прав, для PHP <= 5.2. </p>

Но с 5.3 и поздними статическими привязками это будет работать, просто используйте static вместо self внутри функции - теперь это будет работать ... // THX @ deceze для подсказки

для нас скопируйте прошлые примеры сканирования стека overoverflow - это будет работать:

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"
0 голосов
/ 14 июня 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...