php中的DI依赖注入是什么及怎么实现

2023-06-12 16:38:40 php 依赖 注入

本篇内容介绍了“php中的DI依赖注入是什么及怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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();
};

相关文章