Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
PHP 5: Новые возможности.
Шаблоны проектирования
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2006 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
Шаблоны проектирования (design patterns) в программировании представляют собой общие повторяемые решения для часто встречающихся проблем. Это не какие-то конкретные, реализованные в коде, решения, а лишь общее описание схемы решения, применимой к той или иной ситуации. В частности, в объектно-ориентированном программировании шаблоны проектирования показывают, как для достижения нужного результата должны относиться и взаимодействовать
между собой классы и объекты. В отличие от алгоритмов, которые концентрируются на решении вычислительных проблем, шаблоны ориентированы на решение проблем проектирования.
Рассмотрим, как в рамках новой объектной модели PHP 5 могут быть реализованы некоторые шаблоны проектирования.
Шаблон-стратег
Шаблон принятия стратегических решений (Strategy pattern) позволяет "на лету" выбрать нужный в данной ситуации алгоритм из множества возможных.
Например, при отправке электронной почты может понадобиться выбирать, в зависимости от тех или мных текущих обстоятельств, между SMTP сервером, системным приложением sendmail и встроенной функцией mail; при создании изображения или генерации ссылки на архивный файл - выбрать его формат (jpg, gif или png для изображений и tar.gz или zip для архива).
PHP 5 позволяет создать абстрактный класс (или интерфейс) с абстрактным методом, который бы реализовывал конкретный механизм; а на его основе - серию классов-наследников, по одному для каждого возможного решения (Пример 1, «Strategy Pattern»).
Пример 1. Strategy Pattern
<?php
require_once 'HTML/Page2.php';
interface StyleSheetStrategy {
public function setStyleSheet();
}
class FirefoxStrategy extends HTML_Page2 implements StyleSheetStrategy {
public function setStyleSheet()
{
$this->addStyleSheet('styles/firefox.css');
}
}
class DefaultStrategy extends HTML_Page2 implements StyleSheetStrategy {
public function setStyleSheet()
{
$this->addStyleSheet('styles/default.css');
}
}
?>
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false) {
$page = new FirefoxStrategy;
} else {
$page = new DefaultStrategy;
}
$page->setStyleSheet();
$page->setTitle('Design Pattern Test');
$page->setBody('<p>Just a test.</p>');
$page->display();
?>
Шаблон-фабрика
Шаблон производства объекта (Factory Pattern) позволяет создавать объект того или иного класса "на лету". Будучи использованным вместе с шаблоном принятия стратегического решения («Шаблон-стратег»), позволяет выбрать подходящий в данной ситуации класс создаваемого объекта.
В PHP 5 для реализации данного шаблона может быть использован статический метод (например, factory), возвращающий вновь созданный объект нужного класса (Пример 2, «Factory Pattern») в зависимости от полученных аргументов.
Пример 2. Factory Pattern
<?php
class MyPage {
public static function factory($browser = 'Default')
{
$classname = $browser.'Strategy';
return new $classname;
}
}
$browser = strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false ?
'Firefox' : 'Default';
$page = MyPage::factory($browser);
$page->setStyleSheet();
$page->setTitle('Design Pattern Test');
$page->setBody('<p>Just a test.</p>');
$page->display();
?>
Шаблон-одиночка
В ряде случаев с целью унификации бывает необходимо сосредоточить ту или иную функцию в единственном объекте (например, вывод в лог, соединение с сервером базы данных и т. п.). При этом другие объекты в рамках данного приложения должны иметь доступ к такому централизованному объекту. Решением является использование шаблона создания единственного объекта (Singleton Pattern).
Реализация данного шаблона при помощи PHP 5 потребует определения статического метода (например, singleton), возвращающего единственный экземпляр данного класса; статической переменной класса, служащей своего рода флагом; а также предотвращения случайного создания дополнительных экземпляров класса путем прямого использования оператора new или клонирования объекта, что достигается объявлением конструктора класса
и магического метода __clone приватными.
Пример 3. Singleton Pattern
<?php
class Foo {
private static $instance;
private function __construct
{
}
private function __clone
{
}
public static function singleton()
{
if (!isset(self::$instance)) {
$class = __CLASS__;
self::$instance = new $class;
}
return self::$instance;
}
}
$foo = Foo::singleton();
?>
Литература
[1] Wikipedia, The Free Encyclopedia. http://en.wikipedia.org/.