PHP
Правильный путь.
На главную Fork me on GitHub
Вы читаете подробную информацию о…

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

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

Фабрика (англ. Factory)

Этот шаблон является одним из часто используемых. В нём класс просто создаёт объект, который вам необходим. Рассмотрим следующий пример шаблон фабрики:

<?php
class Automobile
{
    private $vehicle_make;
    private $vehicle_model;

    public function __construct($make, $model)
    {
        $this->vehicle_make = $make;
        $this->vehicle_model = $model;
    }

    public function getMakeAndModel()
    {
        return $this->vehicle_make . ' ' . $this->vehicle_model;
    }
}

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

// фабрика создаёт автомобильные объекты
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');

print_r($veyron->getMakeAndModel()); // выведет "Bugatti Veyron"

Этот код создаст объект “Автомобиль”, используя фабрику. Сделав так вы получите два преимущества: во-первых, если вам в дальнейшем нужно изменить, переименовать или заменить класс Automobile, то вы легко это сделаете, просто изменив код в фабрике AutomobileFactory, вместо того, чтобы менять его во всех местах проекта, которые используют класс Automobile; во-вторых, если вам нужно при создании объекта выполнять какие-то операции с этим объектом, то вы можете описать эти операции в фабрике, вместо того чтобы каждый раз их описывать при создании нового объекта.

Использовать шаблон Фабрика не всегда необходимо (или слишком мудро). В примере, что выше код настолько прост, что использование фабрики добавляет не нужную сложность. Однако если вы делаете довольно большой и сложный проект, то использование шаблона Фабрика позволит вам избежать многих хлопот.

Одиночка (англ. Singleton)

При создании веб приложения, часто требуется концептуально и архитектурно предоставить доступ только к одному экземпляру определённого класса. Шаблон Одиночка позволяет это сделать.

<?php
class Singleton
{
    /**
     * @var Singleton The reference to *Singleton* instance of this class
     */
    protected static $instance;
    
    /**
     * Returns the *Singleton* instance of this class.
     *
     * @return Singleton The *Singleton* instance.
     */
    public static function getInstance()
    {
        if (null === static::$instance) {
            static::$instance = new static();
        }

        return static::$instance;
    }

    /**
     * Protected constructor to prevent creating a new instance of the
     * *Singleton* via the `new` operator from outside of this class.
     */
    protected function __construct()
    {
    }

    /**
     * Private clone method to prevent cloning of the instance of the
     * *Singleton* instance.
     *
     * @return void
     */
    private function __clone()
    {
    }

    /**
     * Private unserialize method to prevent unserializing of the *Singleton*
     * instance.
     *
     * @return void
     */
    private function __wakeup()
    {
    }
}

class SingletonChild extends Singleton
{
}

$obj = Singleton::getInstance();
\var_dump($obj === Singleton::getInstance());             // bool(true)

$anotherObj = SingletonChild::getInstance();
\var_dump($anotherObj === Singleton::getInstance());      // bool(false)

\var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)

Этот код реализует данный шаблон, используя статические переменные и статический метод getInstance(). Обратите внимание на следующее:

Шаблон Одиночка полезен тогда, когда нужно быть уверенным, что экземпляр класса только один во жизненном цикле запроса для веб приложения. Обычно это происходит, когда имеется глобальный объект (например Configuration класс) или общий ресурс (например очередь событий).

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

Фронт-контролер (англ. Front Controller)

Шаблон Фронт-контроллер использует единую точку входа для приложения (например, index.php), которая обрабатывает все запросы. Код этого шаблона отвечает за загрузку всех зависимостей, обработку и отправку запроса в браузере. Фронт-контроллер может быть полезным, поскольку способствует модульному коду и предоставляет центральное место, в которое можно внедрить код для каждого запроса (например, санитарная обработка входных данных).

Модель-представление-контроллер (англ. Model-View-Controller)

Модель-представление-контроллер (далее MVC) шаблон из то же серии, что и HMVC, MVVM. MVC позволяет разбить код приложения на логические объекты, которые предназначены для под конкретные задачи. Модель служит как слой к доступу данных и возвращает их в том формате, который необходим приложению. Контроллеры обрабатывают запросы, обрабатывают данные, полученные из модели, и загружают представления, посылая в него ответ. Представления содержат шаблоны (markup, xml и другие), которые отправляются в браузер.

MVC является наиболее распространенным архитектурным шаблоном, который используется в популярных PHP фреймворков.

Больше информации по подобным шаблонам вы можете подчеркнуть в следующих ссылках: