传统的思路是应用程序用到一个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