一文搞懂│php 中的 DI 依赖注入「建议收藏」

一文搞懂│php 中的 DI 依赖注入「建议收藏」学好依赖注入,让编程更简单

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

? 什么是 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();
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170847.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月16日 下午7:46
下一篇 2022年8月16日 下午8:00


相关推荐

  • 从前慢-谷粒商城篇章2

    从前慢-谷粒商城篇章2谷粒商城持续更新中分布式基础篇 1 三级分类 1 1sql 脚本 DROPTABLEIFE pms category CREATETABLE pms category cat id bigint 20 NOTNULLAUTO INCREMENTCOM 分类 id name char 50 DEFAULTNULLC 分类名称 parent cid bigint 20 DEFAULTNULLC

    2025年6月22日
    4
  • potplayer设置快捷键[通俗易懂]

    potplayer设置快捷键[通俗易懂]引言potplayer是一款非常好用的播放器,功能齐全,且无广告,但是我在使用中按错快捷键ctrl+spotplayer就开启了一个叫采集器的东西,非常难受.话说和ctrl+s这么高频使用的快捷键冲突也太令人恼火了吧解决方法在播放区域右键鼠标打开菜单,找到选项按钮按钮????找到快捷键选项卡????添加快捷键,输入ctrl+s,然后选择未定义指令,确定,大功告成!…

    2022年5月22日
    95
  • 情感语音合成技术难点突破与未来展望

    情感语音合成技术难点突破与未来展望PhotobyLukas 语音技术的进步 让机器合成的声音不再顿挫 冰冷 在自然度和可懂度等方面取得了不错的成绩 但当前合成效果在合成音的表现力上 特别是语气和

    2026年3月18日
    0
  • coolfire黑客入门教程系列之(八)最后部分!

    coolfire黑客入门教程系列之(八)最后部分!作者glayjun@2005-06-0309:46:25我将coolfire黑客入门教程系列之(八)这篇教程为开了三部分!!这是最后的部分!!不要再问我coolfire是谁啊!!!呵呵!!我怕!!林正隆,中国台湾著名黑客,中国黑客领军人物。2011年获得COG信息安全终身成就奖林正隆-百度百科说明:本系列文章是整理Coolfire的8篇黑客入门文章,因在浏览网上相关文章的时候,要…

    2022年5月31日
    40
  • java中lambda表达式[通俗易懂]

    java中lambda表达式[通俗易懂]Java8(JDK1.8)中加入的lambda表达式Lambda的使用前提使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才…

    2022年7月8日
    29
  • linux进入cbq文件夹,Linux流量控制(SFQ/TBFPRIO/CBQ/HTB原理介绍)

    linux进入cbq文件夹,Linux流量控制(SFQ/TBFPRIO/CBQ/HTB原理介绍)Linux 流量控制控发不控收 所以只能对产生瓶颈网卡处的发包速率进行控制 而网络瓶颈分析亦为 Linux 网络流控的第一步 二种流控算法 Linux 流量控制控发不控收 所以只能对产生瓶颈网卡处的发包速率进行控制 而网络瓶颈分析亦为 Linux 网络流控的第一步 二种流控算法上分 无类算法用于树叶级无分支的队列 SFQTBFpFIFO 分类算法用于多分支的队列 PRIOHTBCBQ 调度在分类器的

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号