Я сыт по горло отсутствием приличного DI-контейнера для PHP, поэтому сегодня я создал Bucket . Чтобы было ясно, что я считаю неправильным имеющиеся в настоящее время контейнеры (по крайней мере, о которых я знаю), так это то, что они либо нестабильны, заброшены, требуют много предварительной настройки во внешних XML-файлах или тесно связаны с ними. интегрированы в некоторые фреймворки полного стека. Некоторое время я возлагал надежды на Phemto , но, похоже, прогресс застопорился.
Ведро мало что делает, но на самом деле это и есть намерение. Это означает, что это полнофункциональный и, вероятно, без ошибок. И в отличие от Twittee , это действительно полезно как есть.
Bucket — это, в основном, завершение кода, который я описал год назад в работе с Dependencies . Он добавляет несколько дополнительных функций из коробки. В частности:
Фабрика по умолчанию использует отражения / печатные шрифты для определения зависимостей Итак, вы можете пойти:
class Foo {
}
class Bar {
function __construct(Foo $foo) {}
}
$container = new bucket_Container();
$container->get('Bar');
И с интерфейсами:
interface Zap {
}
class Foo implements Zap {
}
class Bar {
function __construct(Zap $zap) {}
}
$container = new bucket_Container();
$container->registerImplementation('Zap', 'Foo');
$container->get('Bar');
Вы можете использовать обратные вызовы для фабрик . Не очень полезно сейчас, но когда PHP 5.3 (надеюсь, очень скоро) увидит свет, вы можете использовать:
$bucket = new bucket_Container(
array(
'pdo' => function($container) {
return new PDO("mysql:host=localhost;dbname=addressbook", "root", "secret");
}
)
);
Вы также можете использовать фабрику на основе классов. Это может быть объединено с обратными вызовами для переопределения методов. Например. если вы создаете обратный вызов, он имеет приоритет над методом класса. До версии 5.3 вы, вероятно, захотите написать фабрики как методы класса:
class MyFactory {
function new_pdo($container) {
return new PDO("mysql:host=localhost;dbname=addressbook", "root", "secret");
}
}
$bucket = new bucket_Container(new MyFactory());
Поддержка детских прицелов . Означает, что вы можете создать локальный контейнер, который не передает состояние своему родителю. Вероятно, не самая важная функция для стандартных веб-приложений, но хорошая функция для более длинных скриптов Использование это:
$container = new bucket_Container();
$scope = $container->makeChildContainer();
Это всего лишь 153 строки кода без каких-либо внешних требований, поэтому вы можете взять свою копию по адресу: http://github.com/troelskn/bucket/tree/master