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

一文搞懂│php 中的 DI 依赖注入的更多相关文章

  1. 一文搞懂 js 中的各种 for 循环的不同之处

    一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...

  2. 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

    Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...

  3. 一文搞懂 SLAM 中的Extension Kalman Filter 算法编程

    作者 | Doreen 01 问题描述 预先知道事物未来的状态总是很有价值的! √ 预知台风的路线可以避免或减轻重大自然灾害的损失. √ 敌国打过来的导弹,如果能够高精度预测轨迹,就能有效拦截. √ ...

  4. 一文搞懂Python中的所有数组数据类型

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  5. 一文搞懂 Java 中的枚举,写得非常好!

    知识点 概念 enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, ...

  6. 一文搞懂js中的typeof用法

    基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好 ...

  7. 一文搞懂│mysql 中的备份恢复、分区分表、主从复制、读写分离

    目录 mysql 的备份和恢复 mysql 的分区分表 mysql 的主从复制读写分离 mysql 的备份和恢复 创建备份管理员 创建备份管理员,并授予管理员相应的权限 备份所需权限:select,r ...

  8. 一文彻底搞懂Java中的环境变量

    一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...

  9. 三文搞懂学会Docker容器技术(中)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...

随机推荐

  1. 739. Daily Temperatures - LeetCode

    Question 739. Daily Temperatures Solution 题目大意:比今天温度还要高还需要几天 思路:笨方法实现,每次遍历未来几天,比今天温度高,就坐标减 Java实现: p ...

  2. 好客租房57-props深入(4props的默认值)

    1给props设置默认值 //导入react     import React from 'react'     import ReactDOM from 'react-dom'     import ...

  3. MATLAB调用NASTRAN的连续计算解决方案

    使用MATLAB调用NASTRAN提交bdf文件计算的方法笔者试过几种,分别做一下介绍 MATLAB直接调用操作系统命令 该方法对单次计算可能方便些,定义一个字符串,并使用eval命令调用,具体格式为 ...

  4. CVPR2022 | 重新审视池化:你的感受野不是最理想的

    前言 本文提出了一种简单而有效的动态优化池操作( Dynamically Optimized Pooling operation),称为DynOPool,它通过学习每一层感受野的最佳大小和形状来优化特 ...

  5. Tarjan算法模板(USACO03FALL受欢迎的牛)

    好文章 #include<bits/stdc++.h> using namespace std; const int N = 10010, M = 50010; int n, m; int ...

  6. 快速选择 第k个数

    快速选择 第k个数 题目描述 给定一个序列,求第k小的数 算法思想 利用快速排序思想,算法复杂度能达到O(n)步骤如下: 1.找到排序分界点x,这里选择区间最左值 2.排序,让左边的值都小于x,右边都 ...

  7. 开发工具-SQL Server官方下载地址

    更新记录 2022年6月10日 完善标题. https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 相关链接: SSMS下载地址 ...

  8. LVGL库入门教程03-布局方式

    LVGL布局方式 LVGL的布局 上一节介绍了如何在 LVGL 中创建控件.如果在创建控件时不给控件安排布局,那么控件默认会被放在父容器的左上角. 可以使用 lv_obj_set_pos(obj, x ...

  9. 聊聊C#中的composite模式

    写在前面 Composite组合模式属于设计模式中比较热门的一个,相信大家对它一定不像对访问者模式那么陌生,毕竟谁又没有遇到过树形结构呢.不过所谓温故而知新,我们还是从一个例子出发,起底一下这个模式吧 ...

  10. 关于个人项目(臻美MV【仿抖音App】)滑动切换视频的分析(前端角度)

    我们知道你天天刷抖音的时候可以上滑切换视频,互不影响.那么我们站在前端的角度能否可以实现这种效果呢?这是我的个人项目:臻美MV 下面我是用Vue写的,现在我把它开源. Vue: 初始界面 <te ...