一文搞懂php中的(DI)依赖注入

前言

很多人在学习php一段时间后都会听到依赖注入这个名词,但是却不太理解,我的理解依赖注入其实是一种php的编程设计模式,虽然它并没有被归位设计模式当中,设计模式的存在都是为了编程的高效性而存在的,依赖注入当然也是。

一、什么是依赖注入 (DI)

依赖注入 (DI)其实本质上是指对类的依赖通过构造器完成自动注入


通俗来说,就是你当前操作一个类,但是这个类的某些方法或者功能不是单单只靠这个类就能完成的,而是要借助另一个类的才能完成的


最直接的标志就是传参数据为对象的时候。严格来说,你想在另一个类中操作另一个类,这两个类之间形成了相互依赖关系,传参的方式叫注入

二、依赖注入出现的原因

在刚开始的时候,php需要在一个类中使用另一个类的时候,通常情况下 都会进行如下操作:

比如我在container类中需要用到adapter类,就需要在使用之前进行实例化

如果需要用到大量的外部类,这就会造成了耦合度太高,很容易造成后期的维护困难

通俗的来讲,也就是container脱离不了外部类去工作,这就叫耦合度太高

class container
{
   private $adapter;

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

三、简单的依赖注入

上面的代码耦合度太高,导致了依赖注入的出现,主要是为了解耦合


如下,我们只需要将所需要操作的类对象传入即可

依赖注入操作的参数是对象,而不是普通参数,是不是有更好的理解了

但是这样的简单依赖注入,会造成如果你依赖的类很多,你传参的时候会很长,容易混乱

class container
{
   private $adapter;

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

四、高阶的依赖注入

为了解决上面参数混乱的问题,这时候,依赖注入进行了进化

通过魔术方法,__get去设置对象

这时候,我们就可以解决依赖太多,参数混乱的问题了

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

$container->adapter = new adapter();

五、依赖注入的应用

我们先定义一个容器类,主要用来向容器中注入你想要操作的类

使用的时候,只需要传容器这一个对象即可

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); //我是调度器

六、高阶优化

在上面的应用中,我们直接将实例化后的对象注入容器中

这样会导致,所有的对象还没有被使用就会被实例化一遍,造成资源的损耗

我们可以传入闭包,这样对象就不会被实例化而注入,当你自己需要使用的时候,再去实例化,就可以减少服务器资源的损耗了

$container = new container();
$container->adapter = new adapter();
 
 
//高阶优化
$container = new container();
$container->adapter = function () {
    return new adapter();
};



原文链接:一文搞懂php中的(DI)依赖注入


推荐阅读:控制反转(IOC)和依赖注入(DI)以php举例



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与
  1. 1楼
    便捷摄影工作室

    好牛,已测试

    2016-02-28 12:04:01 回复
  2. 2楼
    naive

    浏览器换了无数个都看不到密码

    2017-02-23 04:06:13 回复
    • King 作者

      @naive 现在已被屏蔽。我再放上去,我的网站就被屏蔽咯

      2017-02-24 01:46:37 回复

电子邮件地址不会被公开。 必填项已用 *标注

loading