Из цикла статей шаблоны проектирования PHP.
Если перевести называние данного шаблона по русски то оно будет: одиночка.
Зачем он применяется?
Очень часто встречаются такие ситуаций когда необходимо работать только с одним объектом.
Например объект который введёт запись логов нашего скрипта, либо же объект по работе с базой данных, такие объекты не желательно постоянно создавать так как у них обычно есть конструкторы которые либо к базе соединяются, либо открывают какой-то файл, то есть такие объекты не желательно создавать несколько раз.
Поэтому шаблон Singleton гарантирует что у класса будет только один объект, и предоставляет к этому объекту глобальную точку доступа.
Давайте посмотрим как можно создавать шаблон проектирования singleton php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class Counter { // теперь необходимо выполнить одно условие использования шаблона Singleton // запретить создание объекта привычным нам образом // для этого нужно просто сделать конструктор класса закрытым (private) private function __construct() { } // нужно запретить и клонирование объектов private function __clone() { } } $c = new Counter(); // тут возникнет ошибка ?> |
Как же создать объект в шаблоне Singleton?
В данном шаблоне есть специальный метод, который при любом обращений возвращает ссылку на один и тот же экземпляр класса.
Если вызов первый то происходит создание объекта и сохранение его в закрытом статическом свойстве, и затем возвращается значение данного свойства, при дальнейших вызовах будет возвращаться ссылка на ранее созданный объект.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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() {} } |
Разница в проверке:
вместо:
1 |
self::$instance != NULL |
пишем:
1 |
self::$instance instanceof self |