如何理解php的依賴注入


之前寫過關於php依賴注入的文章。。最近發現有的朋友對這個還是理解模糊,在這里我想寫個簡單的實例幫助朋友們理解下。。。
傳統的思路是應用程序用到一個A類,就會創建A類並調用A類的方法,假如這個方法內需要一個B類,就會創建B類並調用B類的方法,而這個方法內需要一個C類,就會創建C類,接着做些其它工作。

<?php
class C
{
    public function doSomething()
    {
        echo __METHOD__, '我是C類|';
    }
}

class B
{
    public function doSomething()
    {
        $bim = new C();
        $bim->doSomething();
        echo __METHOD__, '我是B類|';
    }
}

class A
{
    public function doSomething()
    {
        $bar = new B();
        $bar->doSomething();
        echo __METHOD__, '我是A類|';;
    }
}

$class = new A();
$class->doSomething(); //C::doSomething我是C類|B::doSomething我是B類|A::doSomething我是A類|

使用依賴注入的思路是應用程序用到A類,A類需要B類,B類需要C類,那么先創建C類,再創建B類並把C注入,再創建A類,並把B類注入,再調用A方法,A調用B方法,接着做些其它工作。

<?php

class C
{
    public function doSomething()
    {
        echo __METHOD__, '我是C類|';
    }
}

class B
{
    private $c;

    public function __construct(C $c)
    {
        $this->c = $c;
    }

    public function doSomething()
    {
        $this->c->doSomething();
        echo __METHOD__, '我是B類|';
    }
}
class A
{
    private $b;

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

    public function doSomething()
    {
        $this->b->doSomething();
        echo __METHOD__, '我是A類|';;
    }
}

$class = new A(new B(new C()));
$class->doSomething(); // C::doSomething我是C類|B::doSomething我是B類|A::doSomething我是A類|

這就是控制反轉模式。依賴關系的控制反轉到調用鏈的起點。這樣你可以完全控制依賴關系,通過調整不同的注入對象,來控制程序的行為。例如A類用到了memcache,可以在不修改A類代碼的情況下,改用redis。

使用依賴注入容器后的思路是應用程序需要到A類,就從容器內取得A類,容器創建C類,再創建B類並把C注入,再創建A類,並把B注入,應用程序調用A方法,A調用B方法,接着做些其它工作.

總之容器負責實例化,注入依賴,處理依賴關系等工作。其實依賴注入不難理解哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM