Статьи
Портфолио
Друзья
Контакты

Последние статьи

06.07.2010 Memcache и Zend: у Вас "падает" Memcache? 4 коммент.

06.07.2010 Collabtive - web-based project management software 2 коммент.

03.06.2010 Ускоряем ZF-проекты: автолоад и сборка в один файл 2 коммент.

Все

Категории

PHP 2 стат.

Zend Framework 25 стат.

Javascript 3 стат.

Другое 12 стат.

Книги 1 стат.

Украина 1 стат.

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  Программы  портфолио  php  zend framework  Zend_Db  Smarty  Zend_Form  паттерны  javascript  niceforms  jQuery  Zend_Mail  веб  Google  Zend_Rest  Zend_View_Helper  zend casts  Zend_View  Zend_Layout  speedUp  интернет  Загрузчик фотографий  Flash  ВКонтакте  zend  localization  zend_translate  gettext  антон шевчук  подарки  Я читаю  Книги  sphinx  релизы 

Все

Реклама



Статистика



Rambler's Top100

Главная > Статьи > PHP > Практическая реализация паттерна Singleton на PHP
26.10.08 Практическая реализация паттерна Singleton на PHP

Практически в каждом объектно-ориентированном приложении есть классы, экземпляры которых мы создаём по несколько раз за время выполнения скрипта, например, подключение к базе данных.

 

Но зачем мы делаем такие нагрузочные для  PHP операции? Ведь если подключение к БД было установлено, зачем его закрывать, а через мгновение снова открывать? В неопытных программистов такие операции происходят по несколько раз за один запрос. В идеале я вижу такой сценарий исполнения скрипта:

 

  1. Создали подключение к базе данных;
  2. Использовали его во всех нужных местах нашего приложения;
  3. Закрыли соединение с базой данных.

 

Ваше приложение просто может вновь и вновь использовать экземпляр уже созданного класса. А как же не допустить  создание новых экземпляров класса, если например, другой класс, не знает было ли до этого установлено соединение с БД, которую он использует? Если соединение было установлено, то где его «взять»? Сегодня я расскажу Вам как грамотно и профессионально решить подобную задачу.

 

 

Решение


Решение

 

Конечно, Вы можете сказать мне, что решение уже есть и выдумывать ничего не надо – глобальные переменные. Действительно, Вы вполне сможете использовать глобальные переменные для решения подобных проблем, но их использование неудобное и не грамотное решение.

 

 

Любой Ваш скрипт сможет поменять глобальную переменную, заменить её значение на другое значение и т.д. Вообще, я не хочу углубляться, поэтому я предлагаю Вам почитать о глобальных переменных в сети: http://c2.com/cgi/wiki?GlobalVariablesAreBad.

 

Когда Вы хотите быть уверенными, что создается лишь один экземпляр конкретного класса в Вашем приложении, Вам необходимо использовать т.н. «шаблон проектирования» Singleton(Одиночка). Суть работы класса, который реализует данный паттерн, очень проста:

 

  1. Закрываем доступ к функциям __construct() и __clone(), используя ключевое слово private;
  2. Объявляем статическую защищенную переменную $_instance нашего класса;
  3. Создаём «public static» метод класса getInstance(), который будет возвращать нам экземпляр класса.

 

Как Вы можете сами увидеть, реализовать шаблон проектирования Singleton очень просто. Нужно только хорошо знать объектно-ориентированное программирование, чтобы умело оперировать уровнем доступа к функциям и переменным класса, дабы защитить их от ненормативного использования.

 

Ниже приведен пример класса, который реализует паттерн Singleton:


 

Давайте разберём пошагово весь написанный код. Вначале кода мы объявляем класс SingletonTest. В объявленном классе создаём защищенную статическую переменную $_instance, в которой мы храним экземпляр класса. Далее делаем невозможным вызов функций __construct() и __clone() вне класса (т.е. не можно будет применить к классу оператор new).

 

 

Следующий шаг – дело техники. Функция getInstance(). Данная функция объявлена как статическая и общедоступная, поэтому мы можем вызывать её, даже не создавая экземпляр класса. Функция проверяет, есть ли у нас уже созданный экземпляр класса. Если есть – возвращает его, а если нет – создаёт новый экземпляр, сохраняя его в статической переменной, и потом возвращает его.

 

 

При этом конструктор и деструктор класса выполняются по одному разу, а это очень удобно использовать в своих нуждах (напр. закрыть/открыть файл, подключить/отключить БД и т.д.).

 

 

Делаем выводы


Итак, у нас есть изящное решение и если его мы сможем использовать правильно, то сможем добиться успеха. Все замечания/возражения/дополнения пишите в каменты.

Теги:  php, программирование, паттерны

Другие категории:

■ PHP ■ Zend Framework ■ Javascript ■ Другое ■ Книги ■ Украина
Комментарии к статье
  Скакунов Александр

03.07.09 16:11:22

Прикольно, про _clone() не подумал.

  illusive

02.10.09 23:50:21

Будете знать Подмигивает

  Дмитрий

27.10.09 12:15:16

Отличная статейка!

И просто ОФИГЕННЫЙ дизай блога!!!

Спасибо!

  illusive

27.10.09 13:02:38

Спасибо Улыбается

  Zelinsky

27.10.09 13:52:19

...

И просто ОФИГЕННЫЙ дизай блога!!!

Спасибо!

Cпасибо БОЛЬШОЕ Дмитрий, очень приятно слышать такие комменты в свой адрес Смеётся , пишите если надо что-то по дизайну!

  illusive

27.10.09 14:08:12

Да, ты отрисовал мне отличный диз. Спасибо.

Оставить свой комментарий

 
Статьи | Портфолио | Друзья | Контакты
Идея и мозги: Васильев Андрей © 2008-2010 Web-Blog Кисточка и фантазия: Зелинский Богдан