Вызываемая константа ребенка не доступна в статической функции в родительском - PullRequest
6 голосов
/ 23 января 2010

У меня есть статическая функция в классе, которую нужно вызывать из нескольких дочерних классов. Мне нужна константа из вызывающего дочернего класса, чтобы быть доступным в этой функции. Чтобы эти константы были доступны в других местах, у дочерних классов есть функция, которая возвращает значение этой константы (php 5.2.9).

Однако, когда я в родительском классе, я не могу получить доступ к этой константе, ни с помощью функции, ни напрямую. Это вообще возможно в php 5.2.9 или мне нужно передать его в качестве аргумента?

Это простая версия кода:

abstract class ParentClass {
    static function DoSomething() {
        $not_working = self::show_const();
        $not_working_either = self::SOME_CONST;

        return 'working';
    }
}

class ChildClass extends ParentClass {
    const SOME_CONST = 'some string';

    function show_const() {
        return self::SOME_CONST;
    }
}

$result = ChildClass::DoSomething();

Редактировать: сгенерированная ошибка:

  • Вызов неопределенного метода ParentClass :: show_const () (для функции)
  • Неопределенная константа класса 'SOME_CONST' (используя self :: SOME_CONST)

Ответы [ 2 ]

13 голосов
/ 23 января 2010

К сожалению, то, что вы пытаетесь сделать, не сработает до 5.3. Проблема здесь в раннем статическом связывании по сравнению с позднем статическом связывании. Ключевое слово self связывается рано, поэтому оно ищет только в классе, где оно используется для разрешения символов. Магическая константа __CLASS__ или функция get_class() также не будут работать, они также выполняют раннее статическое связывание. По этой причине в PHP 5.3 ключевое слово static расширилось до позднего связывания при использовании в качестве static::some_method().

.

Так что в 5.3 это будет работать:

abstract class ParentClass {
  public static function DoSomething() {
    return static::show_const();
    // also, you could just do
    //return static::SOME_CONST;
  }
}

class ChildClass extends ParentClass {
  const SOME_CONST = 'some string';
  public static function show_const() {
    return self::SOME_CONST;
  }
}

$result = ChildClass::DoSomething();
2 голосов
/ 23 января 2010

Вам нужно, чтобы ChildClass расширял родительский класс ::

class ChildClass extends ParentClass {

Edit:

Вы пытаетесь сослаться на константу и метод в дочернем классе из родительского класса, который не знает, что константа дочернего класса существует. Это проблема сферы. Ребенок может ссылаться на методы и константы родителя, но не наоборот.

...