Внедрение Зависимостей
Традиционное мышление
/**
* Foo
*/
class Foo
{
public function doSomething($value='')
{
# code...
$Bar = new Bar();
$Bar->doSomething();
echo 'Foo doSomething','
' ;
}
}
/**
* Bar
*/
class Bar
{
public function doSomething($value='')
{
# code...
$Bim = new Bim();
$Bim->doSomething();
echo 'Bar doSomething','
' ;
}
}
/**
* Bim
*/
class Bim
{
public function doSomething($value='')
{
# code...
echo 'Bim doSomething','
' ;
}
}
$doSomething = new Foo();
$doSomething->doSomething();
- Внедрение Зависимостей
Класс Foo используется в приложении, и классу Foo необходим класс Bar. Классу Бара нужен класс Bim, поэтому сначала создайте класс Bim, затем создайте класс Бара и введите Его, затем создайте класс Foo и введите класс Бара. Затем вызовите метод Foo, Foo вызывает метод Bar, а затем сделайте что-нибудь еще.
/**
* Bim2
*/
class Bim2
{
public function doSomething($value='')
{
# code...
echo 'Bim2 doSomething','
' ;
}
}
/**
* Bar2
*/
class Bar2
{
private $bim2 ;
public function __construct(Bim2 $bim2)
{
# code...
$this->bim2 = $bim2 ;
}
public function doSomething($value='')
{
# code...
$this->bim2->doSomething();
echo "Bar2 doSomething",'
';
}
}
/**
* Foo
*/
class Foo2
{
private $bar2 ;
public function __construct(Bar2 $bar2)
{
# code...
$this->bar2 = $bar2 ;
}
public function doSomething($value='')
{
# code...
$this->bar2->doSomething();
echo "Foo2 doSomething",'
';
}
}
$doSomething2 = new Foo2(new Bar2(new Bim2()));
$doSomething2->doSomething();Это режим инверсии управления. Управление зависимостями возвращается к начальной точке цепочки вызовов. Таким образом, вы можете полностью контролировать зависимости и управлять поведением программ, настраивая различные объекты внедрения. Например, если класс Foo использует memcache, вместо изменения кода класса Foo можно использовать redis. Идея использования контейнера для внедрения зависимостей заключается в том, что приложению необходимо перейти в класс Foo и получить класс Foo из контейнера. Контейнер создает класс Bim, затем создает класс Bar и вводит луч в класс Foo, затем создает класс Foo и вводит панель в приложение. Приложение вызывает метод Foo, Foo вызывает метод Bar, а затем выполняет некоторую другую работу.
Расширение: Контейнеры отвечают за создание экземпляров, внедрение зависимостей и обработку зависимостей.