你知道什么是依赖注入吗?php
依赖注入(DI)的概念虽然听起来很深奥,可是若是你用过一些新兴的php框架的话,对于DI必定不陌生,由于它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。git
php中传递依赖关系的三种方案
其实要理解DI,首先要明白在php中如何传递依赖关系。github
第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来建立一个B类,以下代码所示:面试
<?php class A { public function __construct() { $b = new B(); } }
为何这种方案不可取呢?由于这样的话,A与B就耦合在了一块儿,也就是说A类没法脱离B类工做。数据库
第二种方案就是在A类的方法中传入须要的B类,以下代码所示:php框架
<?php class A { public function __construct(B $b) { } }
这种方法比第一种方案有了改进,A类没必要与B类捆绑在一块儿,只要传入的类知足A类的需求,也能够是C类,也能够是D类等等。微信
可是这种方案的弊端在于若是A类依赖的类较多,参数列表会很长,容易发生混乱。架构
第三种方案是使用set方法传入,以下代码所示:并发
这种方法比第一种方案有了改进,A类没必要与B类捆绑在一块儿,只要传入的类知足A类的需求,也能够是C类,也能够是D类等等。 可是这种方案的弊端在于若是A类依赖的类较多,参数列表会很长,容易发生混乱。 第三种方案是使用set方法传入,以下代码所示:框架
<?php class A { public function setB(B $b) { $this->b = $b; } }
这种方案一样存在和第二种方案同样的弊端,当依赖的类增多时,咱们须要些不少不少的set方法。
这时咱们在想若是有一个专门的类(或者说一个容器)能够帮咱们管理这些依赖关系就行了。
一个简单的依赖注入的例子
以下代码来自twittee:
<?php class Container { private $s=array(); function __set($k, $c) { $this->s[$k]=$c; } function __get($k) { return $this->s[$k]($this); } }
有了container类以后咱们能够怎样管理A与B之间的依赖关系呢,用代码说话吧:
<?php class A { private $container; public function __construct(Container $container) { $this->container = $container; } public function doSomeThing() { //do something which needs class B $b = $this->container->getB(); //to do } }
再将B类注入到容器类中:
$c = new Container(); $c->setB(new B());
还能够传入一个匿名函数,这样B类就不会在传入时就当即实例化,而是在真正调用时才完成实例化的工做:
$c = new Container(); $c->setB(function (){ return new B(); });
以上内容但愿帮助到你们,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文免费获取能够微信搜索关注公众号:PHP开源社区,或者访问: