何为依赖注入(DI)?

2023-10-31

何为依赖注入(DEPENDENCY INJECTION)?

平常在写代码的时候,经常会在一个类中写出这样的一段代码(以 PHP 代码展示):

<?php

class Apple
{
    protected $color;

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

在这段代码中,创建了一个 “苹果” 实例的同时,也创建了一个 “红色” 实例,这时,“苹果” 与 “红色” 之间,就产生了一个依赖。

依赖,就是我不能失去你,不然就不能存活了

如果需求变更,需要给 “苹果“ 增加一个青色的属性,在这一段代码中,似乎并没有什么大影响,我们只需要这样:

<?php
class Apple
{
    protected $color;

    public function __construct($color)
    {
        switch ($color){
            case "red":
                $color = new Red();
                break;
            case "green":
                $color = new Green();
                break;
        }
        $this->color = $color;
    }
}

给 ”苹果“ 加多一个属性就完成了,是不是看起来还是挺简单的。但是,当你需要添加一个其他属性的时候,例如:黄苹果。这个时候我们就需要重新编写这个 ”苹果“ 的类了,体验还是没有好转。

那么有什么解决的方法吗?既然在 ”苹果“ 内部实现他的色彩属性不是一个好的做法,何不把 ”苹果“ 色彩的构建放置到外部来实现呢?这就是我们标题所提到的 ”依赖注入“ 了。

依赖注入(dependency injection)

我们看下面一段代码

<?php
interface Color
{
    //在这里我们定义好一些接口
}

class Red implements Color
{
    //Red集成Color接口
}

class Green implements Color
{
    //Green集成Color接口
}

class Apple
{
    protected $color;

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

现在,我们可以从外面传入一个实例化的类到 ”苹果“ 类中了,为了防止传入不相干的实例,我们在 ”苹果“ 类的 __construct 传入的实例进行了限制,传入实例必须实现 ”Color“ 接口。否则就会产生错误。

现在,我们只需要像下面这样就能创造出想要的苹果了:

    $color = new Red();

    $apple = new Apple($color);

这就是一个典型的依赖注入了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何为依赖注入(DI)? 的相关文章

  • php laravel Blade 模板不渲染

    我正在尝试使用 Laravel 和 twitter bootstrap 设置一个基本页面 我安装了 Laravel 并获得了通用的 你在这里 或 w e 图像 这样看起来很闪亮 对于 twitter bootstrap 我在 public
  • 从 freshdesk api 获取所有用户时获取curl_error(): 2 不是有效的 cURL 句柄资源

    我正在创建自己的系统来管理通过其 API 来自 freshdesk com 的所有票证 我正在发出curl 请求以从freshdesk com 获取数据 通过获取与股票相关的数据 它的工作正常 但是当我通过curl请求请求所有用户时 它会给
  • 电子商务是否从头开始

    我需要开发一个包含电子商务部分的新网站 我来这里是想从你那里得到一些关于我应该走哪条路的提示 该网站将有一个静态部分 其中包括一些静态页面和用于销售产品的电子商务部分 我是 Django 和 PHP 开发人员 但这是我第一次需要开发电子商务
  • YUI压缩机或类似的PHP?

    我一直在我的测试服务器上使用 yuicompressor jar 来动态最小化已更改的 JavaScript 文件 现在我已经将网站部署到公共服务器上 我注意到服务器的策略禁止使用 exec 或其等效项 因此我不再执行 java 有没有一个
  • Laravel 5.4 将json保存到数据库

    帮我将 json 保存到数据库 表字段类型 文本 我有带有强制转换数组的模型 class Salesteam extends Model protected casts team members gt array 我想要像这样 index
  • 在 CodeIgniter 中添加新页面

    对于我对 CodeIgniter 和 MVC 系统的无知 我提前表示歉意 我正在帮助一位家庭成员处理他们的商业网站 到目前为止 我已经能够仅通过逻辑来完成大部分所需的更改 但现在我已经走进了死胡同 我不打算继续支持他们 因为我显然不是 Co
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • use 语句顺序会影响 PHP 中的功能吗?

    我使用 PHP 的命名空间已经有一段时间了 我认为它对我的编程来说是一个很好的补充 今天早上我想知道一些关于use陈述 我想知道顺序是否use影响我的 PHP 代码的功能 根据 PHP net 使用别名引用外部完全限定名称或导入的能力是命名
  • 如何在没有 session_destroy 的情况下销毁 Zend_Session_Namespace

    我使用以下方法在临时会话中存储一些值 job new Zend Session Namespace application 我如何只销毁会话应用无需清除所有会话 要从会话中删除值 请对对象属性使用 PHP 的 unset 函数 假设 job
  • Memcache 不会刷新或清除内存

    我一直在尝试清除我的内存缓存 因为我注意到使用时存储占用了近 30 的服务器内存ps aux 所以我运行了以下 php 代码 memcache new Memcache memcache gt connect localhost 11211
  • PHP 中的静态类初始值设定项

    我有一个带有一些静态函数的辅助类 类中的所有函数都需要一个 重 初始化函数来运行一次 就好像它是一个构造函数 有实现这一目标的良好实践吗 我唯一想到的就是打电话init函数 如果它已经运行过一次 使用静态 initialized变种 问题是
  • 在另一个文件中扩展类的正确方法是什么?

    这就是我在 foo php 中的内容 class Foo public foo NULL public foo2 NULL public function setFoo foo foo2 this gt foo foo this gt fo
  • 在 mysqli 准备好的语句程序风格中获取最后插入的 id 的正确方法是什么?

    我正在使用 mysqli 准备好的语句在表中插入记录 如下所示 link mysqli connect localhost my user my password world check connection if link printf
  • php隐藏所有错误[重复]

    这个问题在这里已经有答案了 隐藏的最佳做法是什么allPHP 错误 因为我不想向用户显示错误 我尝试过使用 htacess通过输入代码php flag display errors off在那里 但它返回给我一个500 error 还有其他
  • 如何绕过Access-Control-Allow-Origin?

    我正在一个平台上对我自己的服务器进行ajax调用 他们设置了阻止这些ajax调用的平台 但我需要它从我的服务器获取数据以显示从我的服务器数据库检索到的数据 我的 ajax 脚本正在运行 它可以将数据发送到我的服务器的 php 脚本以允许其处
  • PHP 中的异或加密

    我是 Xor 加密的新手 并且在使用以下代码时遇到了一些问题 function xor this string Let s define our key here key magic key Our plaintext ciphertext
  • 将客户分配到 magento 的多个客户组

    您好 我想将多个组分配给特定客户 例如 Rajat 客户 属于 批发 零售商 电力 实际上我在上面看到了同样的话题每个客户有多个客户组 https stackoverflow com questions 6153011 multiple c
  • WordPress - 类别和子类别的嵌套列表

    我正在尝试显示带有嵌套子类别的 WordPress 类别列表 到目前为止 我只能获取父类别列表或不包括父类别的子类别列表 但我无法将两者连接在一起 这是我想要创建的结果 Parent Category 子类别 子类别 Parent Cate
  • 我如何向 Windows Server IIS 7 中的文件夹授予权限

    我是 PHP 和 Windows Server 新手 在查看我在 PHP 中创建的表单时遇到以下错误 Error in exception handler The stream or file C inetpub wwwroot wrp a
  • Google Drive 服务帐户上传的位置

    我正在尝试使用服务帐户将文件上传到我的 Google 云端硬盘 当我部署此代码时 我不希望用户给予授权 我希望他们上传到我的帐户 我通过 PHP 使用它 下面是我到目前为止的情况 这段代码是基于官方文档给出的例子 当我运行 php 脚本时

随机推荐

  • 2023华为OD机试真题Java实现【动态规划/找出重复代码】

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码
  • MQ相关知识

    http bijian1013 iteye com category 359051 一 操作系统是否有安装该软件 查看版本 dspmqver 一 查看队列管理器运行状态 dspmq 显示结果中QMNAME表示MQ队列管理器的名称 STATU
  • docker基础

    目录 Docker架构图 Dockers常用命令 系统命令 版本信息 系统信息 帮助命令 镜像命令 docker image 搜索镜像 拉取镜像 查看本地镜像 删除镜像 容器命令 docker container 创建容器 查看容器 删除容
  • Golang架构直通车——理解gRPC

    文章目录 gRPC概述 关键技术 HTTP 2 二进制分帧层 数据流优先级 流控制 服务器推送 标头压缩 gRPC Stream gRPC Gateway gRPC概述 gRPC具有以下特点 基于HTTP 2和Protobuf3的通用rpc
  • 【满分】【华为OD机试真题2023 JAVA&JS】AI处理器组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 AI处理器组合 知识点数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2
  • Doris--基础--06--设置内存

    Doris 基础 06 设置内存 1 问题 内存不够时 查询可能会出现 Memory limit exceeded 这是因为doris对每个用户默认设置内存限制为 4g 2 设置内存 2 1 查看当前内存 SHOW VARIABLES LI
  • 操作系统学习(十二)进程调度的时机、切换与过程、方式

    一 知识总览 二 进程调度的时机 需要进行进程调度与切换的情况 不能进行进程调度与切换的情况 1 中断 2 临界区 3 原子操作 临界资源 一段时间内只允许一个进程使用的资源 各个进程需要互斥地访问临界资源 临界区 访问临界资源的那段代码
  • Python——coco格式图像分割数据集转mask

    文章目录 单张coco转mask并显示 批量coco转mask 目前很多深度学习框架中的图像分割套件都使用image mask格式的标签数据 所以为了方便使用写了该脚本进行转换 单张coco转mask并显示 convert coco2mas
  • pycharm matplotlib.pyplot 绘图一闪而过解决办法

    今天在写python作业的时候发现用python绘图使用show方法出现了一点问题 什么问题呢 如题 绘制的窗口一闪而过 不留痕迹 怎么解决 问百度而得之 发现很多都是遇到不识别turtle的关键字 和我遇到的问题都不一样 这就很麻烦 然后
  • 7.Oracle19c RAC集群安装部署

    1 Oracle 19c RAC For Linux安装部署 https edu csdn net course detail 35792 2 Oracle数据库 底层原理解析 解析oracle数据库内部实现 详细讲解了Oracle数据库内
  • Android 状态栏处理三种方式

    记录三种对状态栏处理的方式 只对android 4 4版本以上有效果 第一种 全屏显示 屏蔽掉状态栏 一般是应用查看大图片或者闪屏界面应用 很简单 直接定义style
  • 使用uView根据权限动态配置uni-app中的tabBar

    转载一 动态配置权限 转载二 uniapp页面速成提效工具 uniapp uview ui 可视化 完全自由拖拽 一键生成flex代码网站 http aicode shagua wiki uni index html 十大特性 1 可视化
  • 【halcon】亚像素轮廓XLD

    XLD eXtended Line Descriptions XLD其实就是指的亚像素轮廓 如何理解亚像素 上一篇 halcon入门小技巧 提到的 threshold Image Region 128 255 这个呢 是给了一个灰度的范围
  • Spring Cloud微服务治理框架深度解析

    在学习一个技术之前 首先我们要了解它是做什么的 我们为什么要用它 不然看再多资料都理解不了 因此我们先来讲解下Spring Cloud Spring Cloud是一套微服务治理框架 几乎考虑到了微服务治理的方方面面 那么接下来具体说下 Sp
  • 【爬虫-反爬虫】系列一:反爬虫之签名(6)

    反爬虫之签名 6 本讲介绍的是一种比较麻烦的反爬虫策略 请求签名 请求签名 请求签名指在请求url中增加一个sign字段 通常取值为自定义字段的md5校验码 前面介绍的反爬虫策略基本上都有规律可寻 但签名很让人头疼 因为必须硬手段破解 也就
  • 【Flutter 2-11】Flutter手把手教程UI布局和Widget——列表ListView

    作者 弗拉德 来源 弗拉德 公众号 fulade me ListView ListView是在移动端非常常见的控件 在大多数的展示场景中都离不开ListView 在Flutter中对ListView的封装也非常好 简单几行代码就可以满足我们
  • redis基本操作

    redis是Remote Dictionary Service的简称 也就是远程字典服务 redis 是内存数据库 KV数据库 数据结构数据库 编译安装登录这些操作在之前已经介绍过 这里不再赘述 redis存储结构 redis有多种存储结构
  • 基于Keras的深度学习防止过拟合的策略:学习率、正则化、dropout、权重初始化、Early Stopping等

    本博客致力于记录心得体会 用简单通俗的语言分享经验和代码 记录我们学习的点滴 记录我们成长的过程 Keras包 Keras是深度学习中非常好用的一个工具包 我在刚开始接触深度学习的时候 尝试过用pytorch TensorFlow 但最后我
  • [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • 何为依赖注入(DI)?

    何为依赖注入 DEPENDENCY INJECTION 平常在写代码的时候 经常会在一个类中写出这样的一段代码 以 PHP 代码展示