В этой статье речь пойдет о шаблоне проектирования Одиночка (Singleton) и как этот паттерн применяется в php.
Singleton – это обычный php класс, в логику работы которого включена проверка на эксклюзивность его создания. Т.е. объект класса, построенный по шаблону синглтона, может быть создан лишь один раз. Все будущие попытки обратиться к его методу или свойству, создав новый объект, будут нейтрализованы логикой его работы и перенаправлены на уже имеющийся экземпляр.
Таким образом, класс, построенный по принципу синглтона, будет защищен от многочисленного создания и дублирования действий при интерпретации кода.
Представим, что у нас есть класс, инициализирующий какие либо настройки. Для инициализации он может считывать информацию из текстовых файлов и/или таблиц БД.
Также в этом классе присутствуют интерфейсы для получения тех или иных настроек. Так вот, когда в разных частях программы нам необходимо получить тот или иной параметр настроек, мы создаем новый объект и с помощью его интерфейса получаем данные. В ходе работы системы, проведение таких операций может потребоваться очень часто, и каждый раз будет создаваться новый экземпляр класса, а соответственно будет дублироваться работа по сбору настроек из БД и файлов, что не очень лестно скажется на работе всей системы.
Как вариант можно создать глобальный объект и пользоваться только им, но ничто не защитит его от повторного создания, и пришедший в команду новый неопытный разработчик, пренебрегая соглашением об использовании глобального объекта, будет создавать дубликат столько раз, сколько ему захочется.
/*
* Класс для работы с базой данных mysql
*/
class MySql{
private static $instance;
/*
* Так как у нас приватный конструтор, мы НЕ МОЖЕМ создать объект через new,
* именно поэтому нам нужен статический метод instance, в нем создается объект,
* НО только один раз.
*/
public static function instance() {
if (self::$instance == null)
//self::$instance = new MySql();
self::$instance = new self();
return self::$instance;
}
/*
* Защита от дублирования
*/
private function __clone() {}
private function __wakeup() {}
/*
* Защищаем вызов конструтора напрямую и создание объекта через new
*/
private function __construct() {
//соединение с базой и выбор базы данных . Эти действия будут выполняться только один раз
}
}