之前寫過關於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方法,接着做些其它工作.
總之容器負責實例化,注入依賴,處理依賴關系等工作。其實依賴注入不難理解哦。