Skip to content

Feature Type resolution

github-actions[bot] edited this page Jul 8, 2026 · 1 revision

🧬 Union / nullable / intersection типы

← Возможности · Главная · Сравнение

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.

Clone this wiki locally