PHP依赖注入原理与用法分析

你知道什么是依赖注入吗?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开源社区,或者访问:

2021金三银四大厂面试真题集锦,必看!

四年精华PHP技术文章整理合集——PHP框架篇

四年精华PHP技术文合集——微服务架构篇

四年精华PHP技术文合集——分布式架构篇

四年精华PHP技术文合集——高并发场景篇

四年精华PHP技术文章整理合集——数据库篇

相关文章
相关标签/搜索