0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Применение полиморфизма подтипов не убирает условные конструкции полностью (кроме некоторых случаев диспетчеризации, например, по ключу или по имени файла). Чаще условная конструкция остаётся одна, только на уровне выбора подходящей реализации, а вот затем эта реализация используется внутри полиморфной функции прямым способом без условий. В одном из прошлых уроков мы рассмотрели пример функции, которая выбирает необходимую реализацию стратегии на основе возраста пользователя и возвращает её наружу.</p>
1
<p>Применение полиморфизма подтипов не убирает условные конструкции полностью (кроме некоторых случаев диспетчеризации, например, по ключу или по имени файла). Чаще условная конструкция остаётся одна, только на уровне выбора подходящей реализации, а вот затем эта реализация используется внутри полиморфной функции прямым способом без условий. В одном из прошлых уроков мы рассмотрели пример функции, которая выбирает необходимую реализацию стратегии на основе возраста пользователя и возвращает её наружу.</p>
2
<p>Функция, которая: выбирает нужный класс, создает объект и возвращает его наружу, называется фабрикой (более точно фабричным методом). Громкое имя для очень простой штуки. Фабрика может быть реализована любым способом включая всё, что разбиралось в этом курсе.</p>
2
<p>Функция, которая: выбирает нужный класс, создает объект и возвращает его наружу, называется фабрикой (более точно фабричным методом). Громкое имя для очень простой штуки. Фабрика может быть реализована любым способом включая всё, что разбиралось в этом курсе.</p>
3
<p>В общем случае фабрикой называют всё подряд, что создает объект или коллекции объектов. Причём не обязательно разных классов, класс может быть и один, но сам процесс создания включает в себя какие-то предварительные вычисления. В реальных проектах фабрики могут быть<a>огромными</a>.</p>
3
<p>В общем случае фабрикой называют всё подряд, что создает объект или коллекции объектов. Причём не обязательно разных классов, класс может быть и один, но сам процесс создания включает в себя какие-то предварительные вычисления. В реальных проектах фабрики могут быть<a>огромными</a>.</p>
4
<p>Фабрики часто реализуются как классы с одним статическим методом - factory. Сами фабрики объектами не делают (иногда таки делают), так как это не абстракция данных, а подменять их смысла нет, иначе получится подмена подменятора.</p>
4
<p>Фабрики часто реализуются как классы с одним статическим методом - factory. Сами фабрики объектами не делают (иногда таки делают), так как это не абстракция данных, а подменять их смысла нет, иначе получится подмена подменятора.</p>
5
<h2>Диспетчеризация класса</h2>
5
<h2>Диспетчеризация класса</h2>
6
<p>PHP позволяет создавать объекты, используя имя класса как строку:</p>
6
<p>PHP позволяет создавать объекты, используя имя класса как строку:</p>
7
<p><em>В большинстве других динамических языков, класс и так объект первого рода, и им можно пользоваться как обычными данными.</em></p>
7
<p><em>В большинстве других динамических языков, класс и так объект первого рода, и им можно пользоваться как обычными данными.</em></p>
8
<p>Такой синтаксис открывает широкий простор для диспетчеризации. Например, в некоторых ситуациях получится уйти от условных конструкций вообще:</p>
8
<p>Такой синтаксис открывает широкий простор для диспетчеризации. Например, в некоторых ситуациях получится уйти от условных конструкций вообще:</p>
9
<p>В этом коде есть одна небольшая проблема. Она связана с тем, что нужно указывать полное имя класса, включая все пространства имён, иначе этот код не заработает. От неё можно уйти если использовать специальный синтаксис извлечения полного имени класса:</p>
9
<p>В этом коде есть одна небольшая проблема. Она связана с тем, что нужно указывать полное имя класса, включая все пространства имён, иначе этот код не заработает. От неё можно уйти если использовать специальный синтаксис извлечения полного имени класса:</p>
10
<p>То есть достаточно после имени любого класса добавить ::class и получится выражение, которое возвращает полное имя класса в виде строки.</p>
10
<p>То есть достаточно после имени любого класса добавить ::class и получится выражение, которое возвращает полное имя класса в виде строки.</p>
11
<p>Иногда идут ещё дальше и формируют само имя класса динамически. Это можно сделать даже с кодом выше. По нему видно, что имя класса однозначно выводится из типа пользователя. Ниже пример, в котором фабрика вообще не содержит конкретных имён классов, она выводит их на основе соглашения об именовании:<em>type => typePolicy</em>.</p>
11
<p>Иногда идут ещё дальше и формируют само имя класса динамически. Это можно сделать даже с кодом выше. По нему видно, что имя класса однозначно выводится из типа пользователя. Ниже пример, в котором фабрика вообще не содержит конкретных имён классов, она выводит их на основе соглашения об именовании:<em>type => typePolicy</em>.</p>
12
12