总结: 依赖注入传统思维应用程序使用类将创建类并调用类的技术。 这样你就可以完全控制依赖关系,并通过调整不同的注入对象来控制程序的行为。 如果使用了类,可以直接使用,无需更改类代码。
依赖注入
传统思维方式
应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法。 假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法。 而这个方法内需要一个Bim类,就会创建Bim类,接着做些其它工作。
/** * 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类php依赖注入,
Bar类需要Bim类,所以首先创建Bim类,然后创建Bar类并注入Bim,然后创建Foo类,并注入Bar类,
然后调用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类并注入Bim,然后创建Foo类php依赖注入,并注入Bar,应用程序调用Foo方法,Foo调用Bar方法,然后做一些其他工作。
扩展:容器负责实例化、依赖注入和依赖处理。