Skip to content

Feature Bind

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

🧲 bind() — интерфейс → реализация

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

bind($abstract, $concrete) привязывает интерфейс (или абстрактный id) к конкретному классу, который контейнер autowire-ит при запросе абстракции.

Принцип работы

bind(LoggerInterface::class, FileLogger::class) регистрирует правило: при get(LoggerInterface::class) контейнер разрешает FileLogger через autowiring (собирая его зависимости) и возвращает как реализацию интерфейса. В отличие от алиаса, целевой класс не обязан быть заранее зарегистрирован — он собирается autowiring-ом.

$c->enableAutowiring();
$c->bind(LoggerInterface::class, FileLogger::class);

$service = $c->get(ReportService::class); // ReportService(LoggerInterface $log)
// → в конструктор придёт FileLogger, собранный autowiring-ом

Плюсы

  • Программирование через интерфейсы: зависимости объявляют контракт, реализация подставляется контейнером.
  • Не требует ручной фабрики для реализации — работает с autowiring.
  • Легко подменять реализацию (prod/test, разные драйверы).

Минусы

  • Требует включённого autowiring для сборки конкретного класса.
  • Одна глобальная привязка на интерфейс — если разным потребителям нужны разные реализации, нужен contextual binding.

✅ Рекомендуется

  • Привязывать каждый прикладной интерфейс к реализации в composition root (bootstrap), а не по месту.
  • Использовать вместе с contextual binding, когда одному потребителю нужна особая реализация.

❌ Антипаттерны

  • bind() на конкретный класс самого себя — бессмысленно (это делает autowiring).
  • Менять привязки в рантайме после старта — приводит к неочевидному состоянию; фиксируйте на bootstrap и по возможности freeze().

Аналоги в других контейнерах

Контейнер Аналог
PHP-DI \DI\autowire(FileLogger::class) для интерфейса
Symfony LoggerInterface: '@FileLogger' / autoconfigure
Laravel bind(LoggerInterface::class, FileLogger::class)
Pimple нет (❌ — только ручные фабрики)
Nette автоувязка по типу + setType()

Все кроме Pimple поддерживают привязку интерфейс → реализация.

См. также: Contextual binding · Constructor autowiring.

Clone this wiki locally