Из цикла статей шаблоны проектирования 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