Singleton шаблон проектирования php

Из цикла статей шаблоны проектирования PHP.

Если перевести называние данного шаблона по русски то оно будет: одиночка.

Зачем он применяется?

Очень часто встречаются такие ситуаций когда необходимо работать только с одним объектом.

Например объект который введёт запись логов нашего скрипта, либо же объект по работе с базой данных, такие объекты не желательно постоянно создавать так как у них обычно есть конструкторы которые либо к базе соединяются, либо открывают какой-то файл, то есть такие объекты не желательно создавать несколько раз.

Поэтому шаблон Singleton гарантирует что у класса будет только один объект, и предоставляет к этому объекту глобальную точку доступа.

Давайте посмотрим как можно создавать шаблон проектирования singleton php:

<?php

class Counter {
 // теперь необходимо выполнить одно условие использования шаблона Singleton
 // запретить создание объекта привычным нам образом
 // для этого нужно просто сделать конструктор класса закрытым (private)
 private function __construct() {

 }

 // нужно запретить и клонирование объектов
 private function __clone() {
  
 }
}

$c = new Counter(); // тут возникнет ошибка

?>

Как же создать объект в шаблоне Singleton?

В данном шаблоне есть специальный метод, который при любом обращений возвращает ссылку на один и тот же экземпляр класса.

Если вызов первый то происходит создание объекта и сохранение его в закрытом статическом свойстве, и затем возвращается значение данного свойства, при дальнейших вызовах будет возвращаться ссылка на ранее созданный объект.

<?php

class Counter {

 static $instance = NULL;

 // теперь опишем специальный статический метод который будет возвращать объект данного класса
 static function get_instance() {
  if(self::$instance != NULL) {
   // если объект уже записан
   return self::$instance;
  }else {
   // если объект ещё не создан нужно его создовать и записывать в self::$instance и вернуть его
   return self::$instance = new Counter();
  }
 }

 private function __construct() {
  echo "объект создан";
 }
 private function __clone() {}
}

$ob = Counter::get_instance(); // вывод: объект создан
$ob2 = Counter::get_instance(); // тут уже ничего не выводиться

?>

Альтернативные записи шаблона Singleton

Тоже будем писать класс Counter.

class Counter {
 static $instance = NULL;

 static function get_instance() {
  if(self::$instance instanceof self) {
   return self::$instance;
  }else {
   return self::$instance = new Counter();
  }
 }

 private function __construct() {
  echo "объект создан";
 }
 private function __clone() {}
}

Разница в проверке:

вместо:

self::$instance != NULL

пишем:

self::$instance instanceof self
Valeriu :