Почему не работает наследование такого синглтона?

На сайте есть несколько реестров - сессии, настроек и т. п., все они наследуются от базового абстрактного класса Registry. Чтобы не писать в каждом наследнике метод getInstance, я прописал его в родителе, с использованием static:

<?php
declare(strict_types = 1);
namespace asoft;

abstract class Registry
{
    protected static $instance;

    protected function __construct()
    {
    }

    public static function getInstance(): self
    {
        if (!(static::$instance instanceof static)) {
            static::$instance = new static();
        }

        return static::$instance;
    }

    abstract public function get(string $key);

    abstract public function set(string $key, $value);

    private function __clone()
    {
    }
}


Когда начинаю поочередно создавать инстансы наследников (вызывать, например, SessionRegistry::getInstance()) - получается ужасная белиберда, в которой невозможно разобраться. Прописываю echo 'here' в конструкторе одного наследника - а оно выводится перед созданием другого, поведение совершенно непонятное.

Может кто-то подскажет, где собака порылась? Вроде всё в порядке - static должны замениться именем текущего наследника, то есть всё равно что я прописал бы у каждого getInstance() с self вместо static.

И самое интересное - работает Registry::getInstance(), хотя сам класс абстрактный! Но работает он только после создания наследника - и возвращает он экземпляр этого самого наследника...
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
Audiophile
@Audiophile Автор вопроса
Всё оказалось просто: дети использовали одно поле в памяти (Registry::$instance), так как в них самих это поле не было переопределено. Потому static::$instance в родителе - это было всё равно что self::$instance (обращение к свойству родителя).

Чтобы мой код заработал как надо - пришлось объявить protected static $instance в наследниках (при этом в родителе его вообще можно убрать). Теперь static::$instance обращается к статическому свойству вызванного класса, что мне и нужно было.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ashlst
@Ashlst
Фанат эстетики и красивых решений.
Когда начинаю создавать инстансы наследников

Покажите,пожалуйста,код.
p.s.Сейчас у Вас написан какой-то бред.1)Почему класс абстрактный? 2)Зачем Вы используете static для защищенных методов/свойств,почему не self? 3)static::$instance instanceof static - Что это??
Singleton
instanceof
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы