Абстрактный класс Singleton в PHP
Доброго времени суток! Сегодня мы с Вами рассмотрим один из вариантов реализации абстрактного класса Singleton PHP. Данный вид синглтона позволит нам создавать независимую иерархию подтипов данного класса, тогда как при стандартной реализации такое реализовать не возможно.
Пример кода:
abstract class Singleton
{
// защищенный конструктор
protected function __construct() {}
// статический метод, которые создает конкретный объект
public final static function get()
{
// статический список объектов
static $instances = [];
// получаем класс, который был вызван во время выполнения программы
// ключевое слово static здесь, вместо self, необходимо для позднего статического связывания
$called_class = static::class;
// если список выше еще не содержит объект данного класса,
// то создаем его и помещаем в список
if(!isset($instances[$called_class])) {
$instances[$called_class] = new $called_class;
}
// возвращаем объект подкласса, вызывающему коду
return $instances[$called_class];
}
// для отладки
public function __toString()
{
return static::class;
}
}
Пример использования:
class Db1 extends Singleton {}
class Db2 extends Singleton {}
$db1 = Db1::get();
$db2 = Db2::get();
var_dump($db1);
print PHP_EOL;
var_dump($db2);
print PHP_EOL;
Вывод:
object(Db1)#1 (0) {
}
object(Db2)#2 (0) {
}