Библиотека Интернет Индустрии I2R.ru |
|||
|
Использование паттернов в PHPПопулярные среди фанатов C++ и Java, паттерны (шаблоны) проектирования очень редко обсуждаются программистами на PHP. Однако они являются важной частью компьютерной науки. Более того, они применимы к любому языку, даже PHP. Первой популярной книгой по паттернам проектирования была книга "Приемы объектно-ориентированного проектирования. Паттерны проектирования", написанная авторами Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Авторов окрестили "Банда четырех" (Gang of Four), из-за чего шаблоны, описанные в книге, стали называть GoF. Определение паттернаИнтуитивно мы узнаем паттерны при программировании в каждой строке кода. Используя массив, вы уже представляете оптимальную идиому для прохождения по нему. С тех пор, как в PHP появилось выражение foreach, оно стало моим любимым. Другой пример. С более широкой точки зрения мы встречаемся с другой знакомой проблемой: куда в PHP-скрипт поместить функциональность. Большинство проектов требуют разделения функциональности на несколько модулей. Для простого информационного сайта хорошо подходит простая схема с использованием футеров и хедеров, включаемых в страницу. В обоих примерах существует поставленная проблема и заученное решение. Условием определения паттерна является наличие известного решения. Более того, после многократного использования решения, вы можете дать оценку побочным явления, плохим или хорошим, этого решения. Формальное определения паттерна проектирования состоит из четырех частей:
Название дает нам удобный способ ссылаться на паттерн. Описание проблемы дает набор условий, в которых паттерн можно применять. Решение описывает общую стратегию по достижению наилучшего разрешения проблемы. В заключении, в паттерне описываются следствия, которые возникают при применении паттерна. Решения на основе паттернов не очень изобретательны. Они не требуют использования загадочных фишек. Паттерны предоставляют надежные проверенные временем решения. Обычно они оптимизированы для повторного использования, а не для эффективности. Решения оптимизированные для производительности имеют преимущества в отдельных ситуациях и обычно не подходят для общего случая. Например, если вам надо получить сумму трех чисел, вы сделаете это одной строкой кода. Однако общий случай будет, скажем, сложение 10000 чисел, и для этого надо применять массив и цикл. Паттерны тесно связаны с объектно-ориентированным проектированием. С помощью объектно-ориентированного программирования можно создавать достаточно общие модули, называемые объектами. Паттерны проектирования дают общее решение распространенных проблем. Это позволяет не изобретать велосипед. Строго говоря, PHP нельзя назвать объектно-ориентированным языком. У нас есть структуры данных, которые объединяют методы и свойства, однако у нас нет защищенных переменных. Однако это не влияет на применимость ООП. Несколько паттернов будет рассмотрено ниже и будет показано, как обойти недостаток фишек ООП в PHP. ОпределениеПолиморфизм означает присваивание действию одного имени или обозначения, которое совместно используется объектами различных типов, при этом каждый объект реализует действие способом, соответствующим его типу В книге GoF авторы указывают на то, что среда программирования влияет на то, что можно считать паттерном. Например, полиморфизм подходящий паттерн для процедурных языков программирования, в то время как объектно-ориентированные языки, такие как Java, включают его как встроенное свойство. Существует множество паттернов, которые можно было бы здесь привести, однако будут приведены несколько самых известных. Остальные вы можете исследовать самостоятельно, благо книг по этой тематике достаточно. Надо сказать, что применение паттернов в PHP требует некоторых уловок. СинглетонПаттерн "Синглетон" (singleton) применяется в ситуациях, когда нужен единичный экземпляр класса. Применительно к PHP можно рассмотреть селектор, который вы используете на странице несколько раз. Вы можете создать большую глобальную переменную и запихать в нее HTML-код, однако вы не сможете в этом случае задавать, скажем, значение по умолчанию. То есть вам каждый раз придется писать новый код, что не является очень хорошим решением с точки зрения поддержки и развития ресурса. Вместо использования глобальной переменной, паттерн "Синглетон" реализуется с помощью класса со статическим методом, который возвращает объект. Вы вызываете статический метод напрямую, без предварительного объявления экземпляра объекта. До последнего времени PHP не поддерживал статические методы. В приведенной ниже реализации паттерна "Синглетон" используется функция со статической переменной. Если вы используете последние версии PHP 4, то можете пользоваться нотацией class::method(). Ниже приведена реализация селектора выбора цвета, который содержит названия цветов. Реализация состоит из двух частей: определение класса и вспомогательной функции, в которых и применен паттерн "Синглетон". Вспомогательная функция может быть настроена для многих классов, чтобы преобразовывать их в "Синглетон". В других языках мы можем создать общий супер-класс, от которого наследовать более специфичные. <?php //задание класса colorSelector class colorSelector { /* ** Private члены класса */ //массив значений var $value; //значение по умолчанию var $default; //конструктор function colorSelector($value) { //копия массива значений $this->value = $value; } /* ** Public члены класса */ //установка значения по умолчанию function setDefault($default) { $this->default = (integer)$default; } //возвращение HTML-кода селектора function getHTML() { $html .= "Color: "; $html .= "<select>\n"; foreach($this->value as $k=>$v) { $html .= "<option value=\"$k\""; if($k == $this->default) { $html .= " selected"; } $html .= ">$v</option>\n"; } $html .= "</select>\n"; return($html); } } //вспомогательная функция, которая реализует паттерн "Синглетон" function getColorSelector($default) { //единственный экземпляр static $instance; //если экземпляра пока нет, создаем его if(!isset($instance)) { //массив значений для демонстрации примера $instance = new colorSelector( array('red','blue','green')); } $instance->setDefault($default); return($instance); } ?> Комментарии в коде относительно public и private членов класса вставлены для информирования программистов. Заметьте, что конструктор сам по себе является private методом. Это является частью реализации паттерна "Синглетон". Создавать экземпляр colorSelector может только метод getColorSelector. Если бы мы использовали Java, эта функция была бы статическим методом класса. Ниже приведен пример использования паттерна "Синглетон". В реальном проекте между двумя вызовами getColorSelector может быть несколько сотен строк кода. Вызовы могут быть и в разных модулях. Это объясняет причину, по которой я просто не использовал еще раз ту же переменную $c. <?php //импортирование класса colorSelector include_once('colorSelector.php'); //начало формы //вызываем селектор цвета $c = getColorSelector(1); print($c->getHTML()); //продолжение формы //вызываем другой селектор цвета $c = getColorSelector(2); print($c->getHTML()); //форма закончилась ?> Паттерн "Синглетон" имеет некоторые преимущества по сравнению с глобальной переменной. Пока мы используем вспомогательную функцию, мы имеем только один экземпляр класса. Это позволяет избежать затрат при запуске и оптимизировать использование памяти. Заключение функциональности colorSelector в класс хорошо иллюстрирует паттерн, но может не совпадать с вашим стилем программирования. Вы можете достичь таких же результатов, выдернув методы из класса и создав отдельные функции. В данном случае вы должны будете перенести свойства класса value и default в getColorSelector. Источник: Leon Atkinson / Zend |
|
2000-2008 г. Все авторские права соблюдены. |
|