В PHP 8.0 добавлен класс mixed. Тип mixed принимает любое значение. Он эквивалентен объединённому типу object|resource|array|string|float|int|bool|null. Доступно, начиная с PHP 8.0.0.
mixed - это, говоря языком теории типов, высший тип. Это означает, что все остальные типы являются его подтипами.
Шаблоны проектирования в ООП делятся на 4 принципиально разных подтипа:
Основные шаблоны (Fundamental)
Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.
Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость.
Реализация классов шаблоны проектирования также производится с использованием общего абстрактного класса проектирования Принципы объектно-ориентированного программирования, реализованного по паттерну 4.7. Нулевой пациент.
Шаблон проектирования | Описание |
0) Принципы объектно-ориентированного программирования | Реализуются базовые принципы абстракции, инкапсуляции, наследования и полиморфизма |
1) Основные шаблоны (Fundamental) | |
1.1. Шаблон делегирования Delegation pattern | Объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. |
1.2. Шаблон функционального дизайна Functional design | Гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы. |
1.3. Неизменяемый интерфейс Immutable interface | Создание неизменяемого объекта. |
1.4. Интерфейс Interface | Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять. |
1.5. Интерфейс-маркер Marker interface | В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого могут применяться атрибуты или аннотации. |
1.6. Контейнер свойств Property container | Позволяет добавлять дополнительные свойства для класса в контейнер (внутри класса), вместо расширения класса новыми свойствами. |
1.7. Канал событий Event channel | Расширяет шаблон «издатель — подписчик», создавая централизованный канал для событий. Использует объект-представитель для подписки и объект-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одного объекта, даже если он зарегистрирован только на одном канале. |
2) Порождающие шаблоны (Creational) | Шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту. |
2.1. Абстрактная фабрика Abstract factory | Класс, который представляет собой интерфейс для создания компонентов системы. |
2.2. Строитель Builder | Класс, который представляет собой интерфейс для создания сложного объекта. |
2.3. Фабричный метод Factory method | Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. |
2.4. Отложенная инициализация Lazy initialization | Объект, инициализируемый во время первого обращения к нему. |
2.5. Мультитон Multiton | Гарантирует, что класс имеет поименованные экземпляры объекта и обеспечивает глобальную точку доступа к ним. |
2.6. Объектный пул Object pool | Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов. |
2.7. Прототип Prototype | Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор. |
2.8. Получение ресурса есть инициализация Resource acquisition is initialization (RAII) | Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта. |
2.9. Одиночка Singleton | Класс, который может иметь только один экземпляр. |
3) Структурные шаблоны (Structural) | Определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу. |
3.1. Адаптер Adapter / Wrapper | Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс. |
3.2. Мост Bridge | Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо. |
3.3. Компоновщик Composite | Объект, который объединяет в себе объекты, подобные ему самому. |
3.4. Декоратор Decorator | Класс, расширяющий функциональность другого класса без использования наследования. |
3.5. Фасад Facade | Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое. |
3.6. Единая точка входа Front controller | Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы. |
3.7. Приспособленец Flyweight | Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но фактически не являющийся таковым. |
3.8. Заместитель Proxy | Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него. |
4) Поведенческие шаблоны (Behavioral) | Определяют взаимодействие между объектами, увеличивая таким образом его гибкость. |
4.1. Цепочка обязанностей Chain of responsibility | Предназначен для организации в системе уровней ответственности. |
4.2. Команда, Action, Transaction Command | Представляет действие. Объект команды заключает в себе само действие и его параметры. |
4.3. Интерпретатор Interpreter | Решает часто встречающуюся, но подверженную изменениям, задачу. |
4.4. Итератор, Cursor Iterator | Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящих в состав агрегации. |
4.5. Посредник Mediator | Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга. |
4.6. Хранитель Memento | Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях. |
4.7. Нулевой пациент Null Object | Предотвращает нулевые указатели, предоставляя объект «по умолчанию». |
4.8. Наблюдатель Observer | Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии. |
4.9. Слуга Servant | Используется для обеспечения общей функциональности группе классов. |
4.10. Спецификация Specification | Служит для связывания бизнес-логики. |
4.11. Состояние State | Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния. |
4.12. Стратегия Strategy | Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. |
4.13. Шаблонный метод Template method | Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом. |
4.14. Посетитель Visitor | Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы. |
4.15. Простая политика Simple Policy | Описывает операцию проверки прав доступа. |
4.16. Издатель — подписчик Event listener | Описывает процесс передачи сообщений, в котором отправители сообщений, именуемые издателями (англ. publishers), напрямую не привязаны программным кодом отправки сообщений к подписчикам (англ. subscribers). Вместо этого сообщения делятся на классы и не содержат сведений о своих подписчиках, если таковые есть. Аналогичным образом подписчики имеют дело с одним или несколькими классами сообщений, абстрагируясь от конкретных издателей. |
4.17. Одноразовый посетитель Single-serving visitor | Оптимизирует реализацию шаблона посетитель, который инициализируется, единожды используется, и затем удаляется. |
4.18. Иерархический посетитель Hierarchical visitor | Предоставляет способ обхода всех вершин иерархической структуры данных (напр. древовидной). |
Реализация некоторых шаблонов проектирования на php 8.0+ https://github.com/RefactoringGuru/design-patterns-php/tree/main/src/RefactoringGuru