傳統的思路是應用程序用到一個A類,就會建立A類並調用A類的方法,假如這個方法內須要一個B類,就會建立B類並調用B類的方法,而這個方法內須要一個C類,就會建立C類,接着作些其它工做。php
1 <?php 2 class C 3 { 4 public function doSomething() 5 { 6 echo __METHOD__, '我是C類|'; 7 } 8 } 9 10 class B 11 { 12 public function doSomething() 13 { 14 $bim = new C(); 15 $bim->doSomething(); 16 echo __METHOD__, '我是B類|'; 17 } 18 } 19 20 class A 21 { 22 public function doSomething() 23 { 24 $bar = new B(); 25 $bar->doSomething(); 26 echo __METHOD__, '我是A類|';; 27 } 28 } 29 30 $class = new A(); 31 $class->doSomething(); //C::doSomething我是C類|B::doSomething我是B類|A::doSomething我是A類|
使用依賴注入的思路是應用程序用到A類,A類須要B類,B類須要C類,那麼先建立C類,再建立B類並把C注入,再建立A類,並把B類注入,再調用A方法,A調用B方法,接着作些其它工做。redis
1 <?php 2 3 class C 4 { 5 public function doSomething() 6 { 7 echo __METHOD__, '我是C類|'; 8 } 9 } 10 11 class B 12 { 13 private $c; 14 15 public function __construct(C $c) 16 { 17 $this->c = $c; 18 } 19 20 public function doSomething() 21 { 22 $this->c->doSomething(); 23 echo __METHOD__, '我是B類|'; 24 } 25 } 26 class A 27 { 28 private $b; 29 30 public function __construct(B $b) 31 { 32 $this->b = $b; 33 } 34 35 public function doSomething() 36 { 37 $this->b->doSomething(); 38 echo __METHOD__, '我是A類|';; 39 } 40 } 41 42 $class = new A(new B(new C())); 43 $class->doSomething(); // C::doSomething我是C類|B::doSomething我是B類|A::doSomething我是A類|
這就是控制反轉模式。依賴關係的控制反轉到調用鏈的起點。這樣你能夠徹底控制依賴關係,經過調整不一樣的注入對象,來控制程序的行爲。例如A類用到了memcache,能夠在不修改A類代碼的狀況下,改用redis。this
使用依賴注入容器後的思路是應用程序須要到A類,就從容器內取得A類,容器建立C類,再建立B類並把C注入,再建立A類,並把B注入,應用程序調用A方法,A調用B方法,接着作些其它工做.spa