Code前端首页关于Code前端联系我们

什么是 php DI 依赖注入?原因?

terry 2年前 (2023-09-25) 阅读数 53 #后端开发

什么是DI/依赖注入

  • 依赖注入DI其实就是通过构造函数完成对类的依赖,就是自动注入你当前有一个类。但该类的一些方法或功能不能由该类单独执行,而是可以由另一个类来执行
  • 最直接的指示就是参数信息是针对何时传递的。严格来说你想在一个班级中使用另一个班级。这两个类之间存在相互依赖的关系。传递参数的方法就叫注入

?出现依赖注入的原因

  • 当不使用依赖注入时,php当你必须用一个类来使用另一个类时,你经常会做以下操作
  • 比如我是在类容器中,如果要使用类适配器类,则需要在使用前实例化它。 耦合度太高,容易造成后期维护问题
  • 通俗地说,就是❀没有外部类无法工作。这就是所谓的 是不是耦合太高了
<?php
class container
{
    private $adapter;

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

?简单的依赖添加

  • 上面的代码耦合性太强,导致了依赖添加,主要是下面这种情况下的解耦
  • 。必须使用的类对象。即
  • 依赖注入函数的参数是Objects而不是通常的参数。有没有更好的理解?
  • 但是这种简单的依赖注入导致如果你依赖的类很多,给参数的时候又很长,很容易混淆
<?php
class container
{
    private $adapter;

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

?高级依赖注入

  • 为了解决上面的 参数混乱 问题,目前对依赖注入进行了优化
    通过 magic 方法,_ 设置对象
  • 目前,我们能解决依赖太多、参数混乱的问题吗
<?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();
};

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门