-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature 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.
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