什么是 DI / 依赖注入

  • 依赖注入DI 其实实质上是指对类的依赖通过结构器实现 主动注入
  • 艰深来说,就是你以后操作一个类,然而这个类的某些办法或者性能不是单单只靠这个类就能实现的,而是要 借助另一个类 的能力实现的
  • 最间接的标记就是传参数据为对象的时候。严格来说,你想在一个类中操作另一个类,这两个类之间造成了相互依赖关系,传参的形式叫 注入

依赖注入呈现的起因

  • 在未应用依赖注入的时候,php 须要在一个类中应用另一个类的时候,往往都会进行如下操作
  • 比方我在 container 类中须要用到 adapter 类,就须要在应用之前进行实例化
  • 如果须要用到大量的外部类,这就会造成了 耦合度太高,很容易造成前期的 保护艰难
  • 艰深的来讲,也就是 container 脱离不了外部类去工作,这就叫 耦合度太高
<?phpclass container{    private $adapter;    public function __construct()    {        $this->adapter = new adapter();    }}

简略的依赖注入

  • 下面的代码耦合度太高,导致了 依赖注入 的呈现,次要是为了 解耦合
  • 如下案例,咱们只须要将所须要操作的类对象传入即可
  • 依赖注入 操作的参数是 对象,而不是一般参数,是不是有更好的了解了
  • 然而这样的简略依赖注入,会造成如果你依赖的类很多,你传参的时候会很长,容易凌乱
<?phpclass container{    private $adapter;    public function __construct(adapter $adapter)    {        $this->adapter = $adapter;    }}

高阶的依赖注入

  • 为了解决下面 参数凌乱 的问题,这时候,依赖注入进行了优化
    通过魔术办法,__get 去设置对象
  • 这时候,咱们就能够解决依赖太多,参数凌乱的问题了
<?phpclass container{    public $instance = [];    public function __set($name, $value)    {        $this->instance[$name] = $value;    }}$container = new container();$container->adapter = new adapter();$container->autofelix = new autofelix();

依赖注入的利用

  • 咱们先定义一个 容器类,次要用来向容器中 注入 你想要操作的类
  • 应用的时候,只须要传容器这一个 对象 即可
<?phpclass container{    public $instance = [];    public function __set($name, $value)    {        $this->instance[$name] = $value;    }}class adapter{    public $name = '我是调度器';}$container = new container();$container->adapter = new adapter();class autofelix{    private $container;    public function __construct(container $container)    {        $this->container = $container;    }    public function who($class)    {        return $this->container->instance[$class]->name;    }}$autofelix = new autofelix($container);$who = $autofelix->who('adapter');var_dump($who); //我是调度器

依赖注入高阶优化

  • 在下面的利用中,咱们 间接 将实例化后的对象注入容器中
  • 这样会导致,所有的对象还没有被应用就会被实例化一遍,造成 资源的损耗
  • 咱们能够 传入闭包,这样对象就不会被实例化而注入,当你本人须要应用的时候,再去实例化,就能够缩小 服务器资源的损耗
<?php$container = new container();$container->adapter = new adapter();//高阶优化$container = new container();$container->adapter = function () {    return new adapter();};