PHP: Полиморфизм
Теория: Фабрика (Паттерн)
Применение полиморфизма подтипов не убирает условные конструкции полностью (кроме некоторых случаев диспетчеризации, например, по ключу или по имени файла). Чаще условная конструкция остаётся одна, только на уровне выбора подходящей реализации, а вот затем эта реализация используется внутри полиморфной функции прямым способом без условий. В одном из прошлых уроков мы рассмотрели пример функции, которая выбирает необходимую реализацию стратегии на основе возраста пользователя и возвращает её наружу.
Функция, которая: выбирает нужный класс, создает объект и возвращает его наружу, называется фабрикой (более точно фабричным методом). Громкое имя для очень простой штуки. Фабрика может быть реализована любым способом включая всё, что разбиралось в этом курсе.
В общем случае фабрикой называют всё подряд, что создает объект или коллекции объектов. Причём не обязательно разных классов, класс может быть и один, но сам процесс создания включает в себя какие-то предварительные вычисления. В реальных проектах фабрики могут быть огромными.
Фабрики часто реализуются как классы с одним статическим методом – factory. Сами фабрики объектами не делают (иногда таки делают), так как это не абстракция данных, а подменять их смысла нет, иначе получится подмена подменятора.
Диспетчеризация класса
PHP позволяет создавать объекты, используя имя класса как строку:
В большинстве других динамических языков, класс и так объект первого рода, и им можно пользоваться как обычными данными.
Такой синтаксис открывает широкий простор для диспетчеризации. Например, в некоторых ситуациях получится уйти от условных конструкций вообще:
В этом коде есть одна небольшая проблема. Она связана с тем, что нужно указывать полное имя класса, включая все пространства имён, иначе этот код не заработает. От неё можно уйти если использовать специальный синтаксис извлечения полного имени класса:
То есть достаточно после имени любого класса добавить ::class и получится выражение, которое возвращает полное имя класса в виде строки.
Иногда идут ещё дальше и формируют само имя класса динамически. Это можно сделать даже с кодом выше. По нему видно, что имя класса однозначно выводится из типа пользователя. Ниже пример, в котором фабрика вообще не содержит конкретных имён классов, она выводит их на основе соглашения об именовании: type => typePolicy.
Рекомендуемые программы
Завершено
0 / 17
.png)

