Я пытаюсь выяснить, как родительский класс может влиять на статические свойства дочернего класса - без необходимости специального кода в дочернем классе.
У меня есть 3 класса: P
, A
и Q
. Q
- это базовый класс, который P
и A
расширяют.
Есть некоторые действия, которые я хочу выполнить только один раз для дочернего класса - в частности, получить определение таблицы базы данных - независимо от того, сколько разных объектов создано. Идея в том, что мне нужно получить определение только один раз для класса.
Мой базовый класс сейчас такой:
class Q{
public static $__initialized = FALSE;
public static function initialize(){
static::$__initialized = TRUE;
}
}
Простые дочерние классы выглядят так:
// class A is identical
class P extends Q{
public static function isInitialized(){
echo (static::$__initialized) ? 'Initialized' : 'Not initialized';
}
}
Это мой код тестирования:
P::initialize();
A::isInitialized();
Когда вызывается A::isInitialized()
, он выводит «Initialized», даже если это не было.
Я использовал ключевое слово static
в Q::initialize()
, пытаясь связать его с поздним статическим связыванием, но я понимаю, что это не будет ссылаться на P::__initialized
, поскольку __initialized
является определенным в Q
, поэтому static::__initialized
будет ссылаться на свойство Q
.
Есть ли способ выполнить то, что я хочу, без необходимости объявлять __initialized
в P
и A
? Моя цель - иметь возможность написать класс, который расширяет Q
и имеет множество функциональных возможностей, уже доступных (например, загрузку структуры таблицы), без необходимости выполнять какие-либо работы по созданию леса в расширяющем классе.