Практически в каждом объектно-ориентированном приложении есть классы, экземпляры которых мы создаём по несколько раз за время выполнения скрипта, например, подключение к базе данных.
Но зачем мы делаем такие нагрузочные для PHP операции? Ведь если подключение к БД было установлено, зачем его закрывать, а через мгновение снова открывать? В неопытных программистов такие операции происходят по несколько раз за один запрос. В идеале я вижу такой сценарий исполнения скрипта:
- Создали подключение к базе данных;
- Использовали его во всех нужных местах нашего приложения;
- Закрыли соединение с базой данных.
Ваше приложение просто может вновь и вновь использовать экземпляр уже созданного класса. А как же не допустить создание новых экземпляров класса, если например, другой класс, не знает было ли до этого установлено соединение с БД, которую он использует? Если соединение было установлено, то где его «взять»? Сегодня я расскажу Вам как грамотно и профессионально решить подобную задачу.
Решение
![]()
Конечно, Вы можете сказать мне, что решение уже есть и выдумывать ничего не надо – глобальные переменные. Действительно, Вы вполне сможете использовать глобальные переменные для решения подобных проблем, но их использование неудобное и не грамотное решение.
Любой Ваш скрипт сможет поменять глобальную переменную, заменить её значение на другое значение и т.д. Вообще, я не хочу углубляться, поэтому я предлагаю Вам почитать о глобальных переменных в сети: http://c2.com/cgi/wiki?GlobalVariablesAreBad.
Когда Вы хотите быть уверенными, что создается лишь один экземпляр конкретного класса в Вашем приложении, Вам необходимо использовать т.н. «шаблон проектирования» Singleton(Одиночка). Суть работы класса, который реализует данный паттерн, очень проста:
- Закрываем доступ к функциям __construct() и __clone(), используя ключевое слово private;
- Объявляем статическую защищенную переменную $_instance нашего класса;
- Создаём «public static» метод класса getInstance(), который будет возвращать нам экземпляр класса.
Как Вы можете сами увидеть, реализовать шаблон проектирования Singleton очень просто. Нужно только хорошо знать объектно-ориентированное программирование, чтобы умело оперировать уровнем доступа к функциям и переменным класса, дабы защитить их от ненормативного использования.
Ниже приведен пример класса, который реализует паттерн Singleton:
Давайте разберём пошагово весь написанный код. Вначале кода мы объявляем класс SingletonTest. В объявленном классе создаём защищенную статическую переменную $_instance, в которой мы храним экземпляр класса. Далее делаем невозможным вызов функций __construct() и __clone() вне класса (т.е. не можно будет применить к классу оператор new).
Следующий шаг – дело техники. Функция getInstance(). Данная функция объявлена как статическая и общедоступная, поэтому мы можем вызывать её, даже не создавая экземпляр класса. Функция проверяет, есть ли у нас уже созданный экземпляр класса. Если есть – возвращает его, а если нет – создаёт новый экземпляр, сохраняя его в статической переменной, и потом возвращает его.
При этом конструктор и деструктор класса выполняются по одному разу, а это очень удобно использовать в своих нуждах (напр. закрыть/открыть файл, подключить/отключить БД и т.д.).
Делаем выводы
Итак, у нас есть изящное решение и если его мы сможем использовать правильно, то сможем добиться успеха. Все замечания/возражения/дополнения пишите в каменты.



, пишите если надо что-то по дизайну!