На сайте есть несколько реестров - сессии, настроек и т. п., все они наследуются от базового абстрактного класса 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(), хотя сам класс абстрактный! Но работает он только после создания наследника - и возвращает он экземпляр этого самого наследника...