php 依赖注入框架,依赖注入模式(Dependency Injection)

依赖注入模式(Dependency Injection)

由 学院君 创建于5年前, 最后更新于 10个月前

版本号 #3

18333 views

16 likes

0 collects

1、模式定义

依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。

我们先来看看什么是控制反转。

当调用者需要被调用者的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,但在这里,创建被调用者的工作不再由调用者来完成,而是将被调用者的创建移到调用者的外部,从而反转被调用者的创建,消除了调用者对被调用者创建的控制,因此称为控制反转。

要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器/方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。

依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合(loose coupled)、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程。

2、UML 类图

5e9648e8da634ac416e68a3b5eaf22c6.png

3、示例代码

在本例中,我们在 Connection 类(调用者)的构造方法中依赖注入 Parameters 接口的实现类(被调用者),如果不使用依赖注入的话,则必须在 Connection 中创建该接口的实现类实例,这就形成紧耦合代码,如果我们要切换成该接口的其它实现类则必须要修改代码,这对到测试和扩展而言都是极为不利的。

AbstractConfig.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* AbstractConfig类

*/

abstract class AbstractConfig

{

/**

* @var Storage of data

*/

protected $storage;

public function __construct($storage)

{

$this->storage = $storage;

}

}

Parameters.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* Parameters接口

*/

interface Parameters

{

/**

* 获取参数

*

* @param string|int $key

*

* @return mixed

*/

public function get($key);

/**

* 设置参数

*

* @param string|int $key

* @param mixed $value

*/

public function set($key, $value);

}

ArrayConfig.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* ArrayConfig类

*

* 使用数组作为数据源

*/

class ArrayConfig extends AbstractConfig implements Parameters

{

/**

* 获取参数

*

* @param string|int $key

* @param null $default

* @return mixed

*/

public function get($key, $default = null)

{

if (isset($this->storage[$key])) {

return $this->storage[$key];

}

return $default;

}

/**

* 设置参数

*

* @param string|int $key

* @param mixed $value

*/

public function set($key, $value)

{

$this->storage[$key] = $value;

}

}

Connection.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* Connection类

*/

class Connection

{

/**

* @var Configuration

*/

protected $configuration;

/**

* @var Currently connected host

*/

protected $host;

/**

* @param Parameters $config

*/

public function __construct(Parameters $config)

{

$this->configuration = $config;

}

/**

* connection using the injected config

*/

public function connect()

{

$host = $this->configuration->get('host');

// connection to host, authentication etc...

//if connected

$this->host = $host;

}

/*

* 获取当前连接的主机

*

* @return string

*/

public function getHost()

{

return $this->host;

}

}

4、测试代码

Tests/DependencyInjectionTest.php

namespace DesignPatterns\Structural\DependencyInjection\Tests;

use DesignPatterns\Structural\DependencyInjection\ArrayConfig;

use DesignPatterns\Structural\DependencyInjection\Connection;

class DependencyInjectionTest extends \PHPUnit_Framework_TestCase

{

protected $config;

protected $source;

public function setUp()

{

$this->source = include 'config.php';

$this->config = new ArrayConfig($this->source);

}

public function testDependencyInjection()

{

$connection = new Connection($this->config);

$connection->connect();

$this->assertEquals($this->source['host'], $connection->getHost());

}

}

Tests/config.php

return array('host' => 'github.com');

5、总结

依赖注入模式需要在调用者外部完成容器创建以及容器中接口与实现类的运行时绑定工作,在 Laravel 中该容器就是服务容器,而接口与实现类的运行时绑定则在服务提供者中完成。此外,除了在调用者的构造函数中进行依赖注入外,还可以通过在调用者的方法中进行依赖注入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java bit mask,【JDK源码剖析】Java数值类型的包装类

概述Java是一种强类型语言,必须为每一种变量声明一种类型.在Java中一共有8种基本类型(primitive type),其中有4中整型,2种浮点类型,1中用于表示Unicode编码的字符单元的字符类型char和一种用于真值表示的boolean类型之前曾写过几篇博文这些博文大都是在JVM或者计算机组成原理相…

_Linux 服务器存在某进程 CPU 过高如何追溯其问题根源?

问题描述:在本人运维的一个省级平台系统中,最近有用户反应系统很卡一直转圈圈. 经初步核查发现某web服务器节点存在JAVA进程cpu占比超过100%的情况。为了不影响用户使用,暂时只能采取简单粗暴的方法"重启服务器"。这其中有如下2个疑…

大数乘加运算然后取模 c++_脚本语言系列之Java | Java中的运算符

本文主要介绍java中的常见运算符,如算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三目运算符等。一、几个概念int a 3 4; 、就是操作符,是算术运算符,我们还有其他很多的运算符 3,4就是参与运算的操作数 3 4整体…

visio形成数据字典_入职数据产品经理第一天,同事问了我3个问题

什么是数据产品经理?数据产品经理有什么能力要求?数据产品经理的未来发展什么?文章围绕这三个问题进行陈述分析,希望看完能对你有所帮助。最近,前同事老曹跳槽到去了一家初具规模的互联网公司,作为刚入职公…

电脑硬盘内存不足怎么办_电脑内存不足怎么办?三招帮你轻松解决

熟悉PC硬件的小伙伴都知道,内存相对于电脑来说是一个相当重要的部件,内存可以说是相当于CPU的“工作室”,因为PC所有运行的程序都是在内存中运行,它决定了多少、多大的程序能即时运行,如若执行程序过大或者过多就会导致…

ad敷铜后还有部分飞线_种草!车厘子红组合高柜,除了颜美,还有什么好?

最近上新君在AD线下体验店遇到个忍不住一定要推荐的牌子~它是谁呢?卖个关子猜一猜:「家居达人等级测试」开始⏰「线索一」线下店进门右手边这组红色柜子👆「线索二」它是乐高“母国”丹麦的收纳家具品牌,花了37年,就做…

宝塔php开启zip组建,宝塔面板如何开启php扩展

宝塔面板如何开启php扩展?宝塔面板的PHP安装路径为/www/server/php/ 且支持多个PHP版本共存,所以,安装PHP扩展的方法与网上那些示例略有不同。下们通过安装oauth扩展来说明一下如何安装第三方PHP扩展。安装之前,请先到软件列表 –…

win7局域网共享设置_分享几个简单实用的局域网共享设置工具

发现很多朋友对于局域网共享设置都不是很熟悉,特别是现在Windows 10已经越来越普遍,很多用户可能熟悉Windows XP、Winodws7的文件共享、打印机共享比较熟悉,但是一到Windows是就感觉懵逼了!确实Windows 10在共享权限设置这块需要更…

dataframe保存为txt_TxtToMy下载-TxtToMy((txt导入myql数据库))v3.7免费版

TxtToMy是一个数据转换软件,帮助数据库用户导入CSV (TXT)数据到MySQL数据库。用户能够通过TxtToMy更好地将文本(csv)文件数据导入Mysql,十分实用,感兴趣的用户可以自行下载体验。基本简介TxtToMy(txt导入myql数据库)是一款十分优秀的TXT导入到…

外星人台式电脑_推荐|外星人笔记本、主机、台式电脑多少钱?(价格)到底怎么样呢?(双十一)...

自外星人电脑爆火至今,关于它的争议就一直没有断过。有人说外星人电脑是超好用的高配电脑,也有人说买外星人电脑的都是人傻钱多,前段时间我还看到有人还因为这个问题吵了起来。说实话,这真的没有吵架的必要。每个人的消费观念不同…

bpmn流程图_几款流程图制作工具

在流程设计、思路展示、网络布线、工作汇报、简介说明、设计程序等工作中,都少不了要用流程图来形象清晰地说明问题。因此,我们经常需要易用的流程图软件来帮助我们绘制流程图,今天,小编就在这里介绍几款流程图软件。Microsoft Vi…

gdb 没有那个文件或目录_阿黛尔暴瘦变回粉丝喜爱的那个她,依然那样楚楚动人...

阿黛尔(Adele)在《第六夜现场》(Saturday Night Live)主持中首次亮相,穿搭风格再次让人眼前一亮参加15届格莱美奖得主阿黛尔出生于伦敦,已经32岁了,她的R&B音乐获得了两项格莱美奖,在获奖后在表示,她真的不敢相信她…

iphonex售价_库克也非常无奈!颁发新规后:依旧未能阻止苹果12的售价大跳水

【11月2日讯】相信大家都知道,苹果在发布了iPhone 12系列手机之后,为了改变以往iPhone手机首发售价就“破发”的尴尬局面,也是直接颁发了新规,限制了国内补贴力度最强的某电商平台—某多多,试图通过重新掌控供应链渠道…

鼠标连点器电脑版_最值得买的鼠标垫推荐-最佳长款桌垫鼠标垫排行榜【2020年10月】...

超大鼠标垫可以将键盘、鼠标都垫着,大而厚实,操作电脑时更方便,不会出现鼠标垫不够用的情况,而且超大鼠标垫还可作为桌垫,美观大方,适合在家使用。今天给大家推荐最佳长款桌垫鼠标垫排行,希望对大家选购鼠标垫有帮助。第一名 美商海盗船|MM300战场风桌垫海盗船的产品…

superoneclick 2.2_减排二氧化碳2.2万吨!“电能替代”助安吉传统产业绿色转型

近日,安吉县孝丰镇丰缘茶场的茶农夏亚红联系上了国网安吉县供电公司的工作人员,希望对方再来指导一下新安装设备的使用和操作。作为安吉县“节能贷”的用户,夏亚红成为该公司推出的茶农专变新服务的首位受益人,她坦言明年炒茶旺季…

c# spire.xls 设置文字为微软雅黑_只要一分钟,给你的PPT文字加上拼音和声调

每天下午一点,PPT技能进步一点做PPT时必不可少的一项就是字体使用合适的字体可以让我们的PPT更加美观见惯了满屏幕的宋体和微软雅黑你也许想要尝试一下其他的方式来装点的文字何不用拼音?都知道在一些低年级的PPT中会给文字添加拼音相信很多看过语文老师…

xgboost 怎么读_南宁日语培训考级怎么选_在线日语学习

摘要: 南宁日语培训考级怎么选_在线日语学习为你介绍口语学习,听力先行。要先有输入,再有输出。要想有一口规范的日语口语发音,有必要先许多做听力练习。当你的耳朵熟悉了每个单词的发音,你才有时机说出规范的日语。听…

glsl shader 雪_深夜食堂里的雪平锅,美味秘诀:手工打造,高效导热,煮煲炸蒸都好用!...

hello,看今天内容之前生活妹给大家推荐一下各种好吃好用的↓↓↓在日本,几乎每个家庭都有一个雪平锅。日本厨师冨田唯介甚至专门为雪平锅撰写了一本书:《雪平锅无油料理》,里面详细讲诉了雪平锅能做的各类美食,从煮物到…

ubuntu 安装GPU黑屏 修改GRUB_Ubuntu升级安装最新内核的方法与注意事项(以18.04为例)...

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习前言本文主要如何安全地升级Ubuntu内核,以18.04 Server版为例纂写本教程。我们先来了解一下什么是主线内核构建(Mainline Ke…

send tcp char far_TCP/IP之传输层详解

1. 传输层特征传输层位于TCP/IP协议族中的第4层,负责在网络主机中创建虚拟传输控制协议TCP,或用户数据报协议UDP,也叫“Transport Layer”。此层向其主机上运行的应用程序发送和接收数据。传输层将端口号分配给在主机上的应用程序中运行的进程…