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

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

15.10.2011 Zend Framework Day 2011, 12 ноября, Киев (0)

27.09.2011 MSSQL, XML и PHP. Как заставить это работать из под *nix? (0)

22.06.2011 Zend Framework, MSSQL и UTF-8 - проблемы с кодировками (5)

Все

Категории

PHP (2)

Zend Framework (32)

Javascript (4)

Другое (13)

Книги (1)

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  open search  портфолио  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  софт  массовые рассылки  хранение данных 

Все

Статистика



Организация банкетов, фуршетов. Банкет, фуршет, организация корпоративных праздников.
Важную роль в продвижении сайта играет сео оптимизация страниц.
. авиабилеты онлайн, бронирование авиабилетов, авиабилеты Киев Тель Авив.
Оригинальные подарки сотрудникам
Внимание. дизайн студии одессы : для вас.

Главная > Статьи > 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

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

  heavyvital

07.10.11 00:26:25

класс:)

а дизайн тоже 5+:)

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

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