Доступ к дочерним переменным из суперкласса без инстанцирования - PullRequest
1 голос
/ 04 февраля 2009

Я пытаюсь получить доступ к переменным-членам дочернего класса через родительский класс без создания экземпляра.

Это одна из моих попыток, но B::getStatic() не удается с Access to undeclared static property.

Есть ли другое решение, возможно, без статики?

class A {

    static public function getStatic() {

        return self::$myStatic;

    }

}

class B extends A {

    public static $myStatic = 5;

}

class C extends A {

    public static $myStatic = 6;

}

var_dump(B::$myStatic);
var_dump(B::getStatic());

var_dump(C::$myStatic);
var_dump(C::getStatic());

Ответы [ 8 ]

2 голосов
/ 04 февраля 2009

Концепция, с которой вы сталкиваетесь, называется «Позднее статическое связывание». До PHP 5.3.0 это не поддерживалось.

Если вы используете 5.3.0 или выше, обновите метод getStatic ():

статическая открытая функция getStatic () {

return static::$myStatic;

}

1 голос
/ 04 февраля 2009

Остальные правы, так как ваш код не может быть выполнен, так как переменная не существует во время компиляции.

Способ сделать что-то подобное обычно с помощью абстрактного класса (доступен в PHP5 и выше, похоже).

Класс A будет абстрактным классом и будет иметь функцию getStatic (). Классы B и C будут расширять A и иметь определения для функции getStatic (). Таким образом, когда вы вызываете getStatic (), вы получите значение, которое определяет подкласс, поскольку в A. нет определения.

Суть этого подхода в том, что вы не можете создать экземпляр A, поскольку он абстрактный. Вы ВСЕГДА должны будете сделать B или C (или их подкласс).

Вы также можете создать установщик в A, и подклассы используют его для установки значения (вместо '='). Это позволило бы вам создать экземпляр A и установить значение, если оно когда-либо понадобится. Возможно, вы сможете сделать установщик частным, чтобы его нельзя было вызывать напрямую, я не знаю, могут ли подклассы использовать частные функции в PHP.

0 голосов
/ 04 февраля 2009

Из руководства по PHP :

Статические ссылки на текущий класс как self:: или __CLASS__ разрешены используя класс, в котором функция принадлежит, как там, где это было определено:

Так как метод определен в A, когда вы вызываете getStatic() для B или C, он пытается вернуть a::$myStatic, которого не существует. Даже если бы оно существовало, вы бы вернули только это значение, а не переопределенное значение в подклассе.

Решением является Поздняя статическая привязка, но она доступна только в PHP 5.3, который еще не выпущен.

0 голосов
/ 04 февраля 2009

Вы должны переместить myStatic в A. Ваш метод getStatic в A не может получить доступ к переменной, которая не существует в A.

0 голосов
/ 04 февраля 2009
class A {
    public static $myStatic = 5;
}    
class B extends A {
    public static $myStatic = 3;
}
class C extends A {
    public static $myStatic = 1;
}

Тогда просто используйте B :: $ myStatic ...

0 голосов
/ 04 февраля 2009

Класс B наследует свойства от класса A, а не наоборот.

Почему вы не используете B::$myStatic как в вашем примере?

0 голосов
/ 04 февраля 2009

У вас несоответствие между объявлением функции и переменной.

Либо вам нужно переместить объявление функции в B

или

переместить объявление переменной в A.

0 голосов
/ 04 февраля 2009

$myStatic должно быть объявлено статическим в классе A: см. здесь .

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