очень простой паттерн)) я до сих пор не разобрался как контейнерами этими пользоваться.. вместо них использую сейчас реестр)
В теории DI, на практике - от задачи зависит, и от того, если перспектива дальнейшего допиливания или это одноразовый проект. DI если абсолютно чисто использовать, то получится, что ты потом, поменяв одну строчку в конфиге, можешь использовать вместо класса A класс B (при условии, что они реализуют один интерфейс), или даже подставлять разные реализации в зависимости от условий запуска. С синглтонами так не получится --- Добавлено --- DI-контейнер - почти тот же реестр, только (при хорошей реализации) с плюшками, типа автоматической подстановкой в конструкторы
@mkramer это хороший пример или плохой? Взял с хабра PHP: <?php // DI container pattern: class SomeComponent { public function doSomething() { } } class App { public function __construct(SomeComponent $theComponent) { $this->theComponent = $theComponent; } public function run() { $this->theComponent->doSomething(); } } class DIContainer { public function get($className) { switch ($className) { case SomeComponent::class: return new SomeComponent; case App::class: return new App($this->get(SomeComponent::class)); default: throw new Exception; } } } $DIContainer = new DIContainer(); $app = $DIContainer->get(App::class); $app->run();
оно так не работает. что лучше: лопата или экскаватор? что лучше: совок или бульдозер? что лучше: лодка или танкер?
@Dimon2x, это показано, как быстро на коленке собрать DI-контейнер. Ради демонстрации, что это за хрень такая. В реале я бы таким примитивом не пользовался, а взял что-нибудь готовое: в Laravel и Yii2 прекрасные DI-контейнеры, есть и фреймворконезависимые, от PHP League или вот этот: php-di.org P.S. если придераться, то в этот контейнер нельзя ничего записать, а это плохо.
Оценка лучше/хуже всегда зависит от задачи Когда нет конкретной задачи, без разницы что использовать --- Добавлено --- ИМХО, singleton и dependency injection вообще не сравнимые вещи. Как горячее и зелёное.
Ну я читал рекомендацию не пользоваться синглтонами, а заносить их в DI-контейнеры. Тем более, что многие контейнеры позволяют отметить вносимый объект, как синглтон.
Они решают разные задачи, следовательно несравнимы и не являются заменой друг другу, я так это вижу. То, что одна и та же реализация может сочетать в себе признаки разных паттернов, это да. А также в зависимости от места использования, один и тот же класс может выступать в разной роли.
В структуре приложения могут быть использованы разные шаблоны. Синглтон обычно для подключения к базе и т.п. Иньекция зависимости? Зависит от того какой функционал ты хочешь реализовать? В твоем приложении могут быть различные шаблоны, если конечно они уместны и их использование оправдано.