-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Type resolution
github-actions[bot] edited this page Jul 8, 2026
·
1 revision
Autowiring понимает современные типы PHP: ?Type (nullable), A|B (union), A&B (intersection) — и разрешает зависимость по подходящему из вариантов.
При разборе параметра Autowirer через IntersectionTypeResolver / логику union анализирует тип:
-
nullable
?Dep— если зависимость не разрешается и параметр допускаетnull(или имеет дефолт), подставляетсяnull/дефолт, а не бросается исключение. -
union
A|B— перебирает варианты и берёт первый разрешимый из контейнера. -
intersection
A&B— ищет сервис, удовлетворяющий всем интерфейсам сразу.
final class Handler
{
public function __construct(
private ?CacheInterface $cache, // необязательная — может быть null
private LoggerA|LoggerB $log, // первый разрешимый
private Countable&Iterator $collection, // удовлетворяет обоим
) {}
}- Гибкость типизации без ручных фабрик — контейнер следует системе типов PHP.
- Nullable-зависимости позволяют «опциональные» коллабораторы без падений.
- Корректная работа с современным кодом (PHP 8.1+ intersection).
- Union может разрешиться не тем вариантом, если оба зарегистрированы, — порядок важен, лучше избегать неоднозначности.
- Intersection требует, чтобы существовал сервис, реализующий все интерфейсы.
- Использовать
?Depдля действительно опциональных зависимостей (кэш, метрики). - Для union — регистрировать только один разрешимый вариант, чтобы выбор был детерминирован.
- Полагаться на union
A|B, когда оба разрешимы, ожидая конкретный, — поведение неочевидно; используйте contextual или явный#[Inject]. - Прятать обязательную зависимость под
?Type, маскируя ошибку конфигурации.
| Контейнер | Аналог |
|---|---|
| PHP-DI | union/nullable — да; intersection — ограниченно |
| Symfony | поддержка union/intersection в autowiring |
| Laravel | nullable/union — да |
| Pimple | нет autowiring (❌) |
| Nette | автоувязка по типам, union — частично |
Все кроме Pimple; CloudCastle покрывает nullable + union + intersection.
См. также: Constructor autowiring · Contextual binding.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton