IOC容器

php的依赖注入

传统的思路是应用程序用到一个A类,就会创建A类并调用A类的方法,假如这个方法内需要一个B类,就会创建B类并调用B类的方法,而这个方法内需要一个C类,就会创建C类,接着做些其它工作。

 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方法,接着做些其它工作。

 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。

使用依赖注入容器后的思路是应用程序需要到A类,就从容器内取得A类,容器创建C类,再创建B类并把C注入,再创建A类,并把B注入,应用程序调用A方法,A调用B方法,接着做些其它工作.

原文地址:https://www.cnblogs.com/BrokenHeart/p/10681356.html