Итераторы объектов
Магические методы
Классы и объекты (PHP 5)
PHP Manual

## Шаблоны проектирования

Шаблоны - это способ описания оптимальных методов и хороших дизайнов проектирования. Они предоставляют универсальные пути решения общих проблем программирования.

### Фабрика (Factory)

Шаблон Фабрика позволяет создавать объекты во время работы программы. Этот шаблон называется Фабрикой потому, что он отвечает за производство объекта. Параметризированная фабрика принимает в качестве аргумента имя класса, объект которого создается.

Пример #1 Параметризированный фабричный метод

`<?php
class Example
{
// Параметризированный фабричный метод
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Драйвер не найден');
}
}
}
?>`

Определение этого метода в классе позволяет драйверам быть загруженными "на лету". В случае, если класс Example был бы классом абстрактного доступа к базе данных, то загрузка драйвера MySQL и SQLite может быть выполнена следующим образом:

`<?php
// Загрузка драйвера MySQL
$mysql = Example::factory('MySQL');
// Загрузка драйвера SQLite
$sqlite = Example::factory('SQLite');
?>`

### Синглтон (Singleton)

Шаблон проектирования Синглтон применяется в тех ситуациях, когда нужно получить единственный экземпляр класса. Большинство примеров, связанных с этим - это взаимодействие с базой данных. Реализация этого шаблона позволяют программисту создать единственный экземпляр класса, к которому будут иметь доступ остальные объекты.

Пример #2 Функция Синглтон

`<?php
class Example
{
// Содержит экземпляр класса
private static $instance;
// Закрытый конструктор; предотвращает прямой доступ к
// созданию объекта
private function __construct()
{
echo 'Я конструктор';
}
// Метод синглтон
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Метод для примера
public function bark()
{
echo 'Гав!';
}
// Предотвращает клонирование экземпляра класса
public function __clone()
{
trigger_error('Клонирование запрещено.', E_USER_ERROR);
}
}
?>`

Позволяет вернуть единственный экземпляр класса Example

`<?php
// Такой вариант завершится неудачей, так как конструктор
// объявлен как private
$test = new Example;
// Это всегда возвращает единственный экземпляр класса
$test = Example::singleton();
$test->bark();
// Это вызовет ошибку E_USER_ERROR.
$test_clone = clone $test;
?>`

Итераторы объектов
Магические методы
Классы и объекты (PHP 5)
PHP Manual