Рубрики
Uncategorized

Внедрение зависимостей PHP (полный код)

Автор оригинала: David Wong.

Внедрение Зависимостей

  • Традиционное мышление

/**
*  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, а затем выполняет некоторую другую работу.

Расширение: Контейнеры отвечают за создание экземпляров, внедрение зависимостей и обработку зависимостей.