2012-04-13 2 views
2

Я пытаюсь понять, как использовать контейнер DI.Вручную создать/использовать контейнер DI в PHP?

Скажем, у меня есть три класса: A, B, и C определены следующим образом:

class A {} 

class B 
{ 
    private $a; 

    public function set_a(A $a) 
    { 
     $this->a = $a; 
    } 
} 

class C 
{ 
    private $b; 

    public function set_b(B $b) 
    { 
     $this->b = $b; 
    } 
} 

Теперь то, что я на самом деле не получить, то, что я должен написать в index.php. Я читал, что создать экземпляр контейнера не рекомендуется, а затем передать его моим объектам, чтобы они могли использовать его, потому что он заставляет мои объекты зависать от контейнера. Но это значит, то, что я должен написать что-то вроде этого в index.php:

$container = new Container(); 
$container->a = function($ctnr) { 
    return new A(); 
} 
$container->b = function($ctnr) { 
    $b = new B(); 
    $b->set_a($ctnr->a); 
    return $b; 
} 
$container->b = function($ctnr) { 
    $c = new C(); 
    $c->set_b($ctnr->b); 
    return $c; 
} 

$c = $container->c; 

Является ли это путь?

ответ

0

Я думаю, вы поняли концепцию.

Основная идея внедрения зависимостей заключается в том, что вы делегируете создание объекта в фреймворк.

Вы можете написать свой собственный контейнер, но я рекомендую вам использовать фреймворк.

Большинство фреймворков позволяют вам решать, какие типы и где их следует вводить.

Symfony - довольно хороший контейнер.

0

Вся идея контейнера заключается в разрешении зависимостей и выполнении инициализации объектов.

Я бы сделал: Выберите свой контейнер. Я написал один, для удовольствия, который используется в нескольких приложениях. (https://github.com/niclaslindberg/webx-ioc/). Создайте свои зависимости с интерфейсами. (Только позволить классам зависеть от других интерфейсов). Зарегистрируйте свои классы/экземпляры и дайте контейнеру выполнить всю грязную работу.

Смежные вопросы