乐趣区

关于依赖注入:一文搞懂│php-中的-DI-依赖注入

🎈 什么是 DI / 依赖注入

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

🎈 依赖注入呈现的起因

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

    public function __construct()
    {$this->adapter = new adapter();
    }
}

🎈 简略的依赖注入

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

    public function __construct(adapter $adapter)
    {$this->adapter = $adapter;}
}

🎈 高阶的依赖注入

  • 为了解决下面 参数凌乱 的问题,这时候,依赖注入进行了优化
    通过魔术办法,__get 去设置对象
  • 这时候,咱们就能够解决依赖太多,参数凌乱的问题了
<?php
class container
{public $instance = [];

    public function __set($name, $value)
    {$this->instance[$name] = $value;
    }
}

$container = new container();

$container->adapter = new adapter();
$container->autofelix = new autofelix();

🎈 依赖注入的利用

  • 咱们先定义一个 容器类 ,次要用来向容器中 注入 你想要操作的类
  • 应用的时候,只须要传容器这一个 对象 即可
<?php
class 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();
};
退出移动版