У меня возникли проблемы с наследованием PHP. Вот сделка:PHP-синглтоны и наследование
У меня есть этот базовый класс, Singleton:
namespace My_Namespace;
abstract class Singleton {
protected static $instance = null;
static function get() {
if (null == static::$instance) {
static::$instance = new static;
}
return static::$instance;
}
private function __construct() {
}
}
У меня есть куча классов, наследующих этот класс Singleton, назовем их A, B, C, D. Один из них выглядит следующим образом:
namespace My_Namespace;
class A extends Singleton {
protected function __construct() {
B::get();
if (some_condition()) {
C::get();
}
else {
D::get();
}
}
}
Теперь, я просто сделать A::get()
, чтобы получить все это качению. Конструктор A называется, как и ожидалось. Затем строится конструктор B, опять же без проблем. Теперь это странно. Когда вызывается C::get()
, он распознает static::$instance
как уже объект класса B и не создает экземпляр C вообще. Я знаю, если я вроде как-то их цепочка, то есть __construct
из B звонков C::get
или D::get
это работает, но это не оптимально для моих целей. Это связано с тем, что они находятся в одном и том же объеме? Если да, есть ли способ обойти это? Я задаю это скорее скорее любопытство, чем практическую цель. Я знаю, что я могу так же легко реализовать одноэлементный шаблон в каждом из них. Итак, какие-то идеи? Благодаря!
P.S. Пожалуйста, не «синглтоны злые, а вы должны сжечь в аду». Я это прекрасно знаю.
+1 для 'no ... burn in hell comments' – phpisuber01
Я считаю, что унаследованным классам требуется статическое свойство для того, чтобы экземпляр был заглушен ... поэтому добавьте' protected static $ instance = null; 'в подклассы , – Orangepill
@Orangepill у вас есть. Я добавил эту строку, и все работает так, как ожидалось. 'НО:' Этот тип делает весь класс Singleton и наследование бесполезным, хотя ... Идея заключалась в том, что в этом классе есть одноэлементная функциональность. Возможно ли это вообще? –