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,一经查实,立即删除!

相关文章

php点加等于0,php 做数学运算时结果为0的原因

MSSQL—字符串分离(Split函数)前面提到了记录合并,有了合并需求肯定也会有分离需求,说到字符串分离,大家肯定会想到SPLIT函数,这个在.NET,Java和JS中都有函数,很可惜在SQL SERVER中没有,我们只能自己来写这么一个 ...更好的使用chromeCtrltab 在标…

php守护进程内存溢出,$serv-close($fd); 服务端主动断开客户端有问题!

core > array(reactor_num > 2, // 线程数. 一般设置为CPU核数的1-4倍worker_num > 16, // 工作进程数量. 设置为CPU的1-4倍最合理max_request > 0, // 防止 PHP 内存溢出, 一个工作进程处理 X 次任务后自动重启 (注: 0,不自动重启)max_conn > 10000, // 最大连…

apache php显示成列表,centos中设置apache显示目录列表

miniui中常用的状态显示方式1.查询sys_code表得到对应的状态 考生状态:oracle中文显示为问号在用PL/sql查询时,中文显示为问号.经查证,发现问题为oracle字符集不支持中文导致的.修改oracle字符集,改为支持中文即可. 方法: 第一步:修改注册表. 开始-运行-输入regedit- ...PHP&am…

php 反射对象属性,php面向对象之反射功能的用法详解

这篇文章主要介绍了php面向对象之反射功能与用法,结合实例形式简单分析了php5面向对象反射的概念及具体用法,需要的朋友可以参考下本文实例讲述了php面向对象之反射功能与用法。分享给大家供大家参考,具体如下:个人对反射定义的理解:首先得说…

mac php errorlog,Mac下使用php的error_log()函数发送邮件

在开发web项目或者其他场景下,有时候我们需要设置“报警”。比如当数据库的某一项指标达到某一个值时,需要通知网站管理员。今天跟大家分享一个比较简单的php报警的功能。先介绍一个php中用来记录log的一个函数error_log,它用来发送错误到某个地方。函数…

matlab 数值格式转换,Matlab字符串转换及数值格式转换

Matlab字符串转换及数值格式转换字符串转换函数abs 字符串到ASCII转换dec2hex 十进制数到十六进制字符串转换fprintf 把格式化的文本写到文件中或显示屏上hex2dec 十六进制字符串转换成十进制数hex2num 十六进制字符串转换成IEEE浮点数int2str 整数转换成字符串lower 字符串转换…

matlab算hht,关于MATLAB中HHT谱图的问题【百度知道悬赏100积分】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼附上MATLAB内置的hht绘图函数hhtPlot.m的代码:classdef hhtPlotpropertieshfigendmethodsfunction [this] hhtPlot(insFreq, insEnergy, tvec, FRange, MinThres, FreqLoc, isNormFreq)isYAxis strcmpi(FreqLoc,yaxis…

基于matlab的彩色图像分割,彩色图像分割MATLAB

【实例简介】基于HSV彩色空间的图像分割,包含测试图片,MATLAB源程序,可以参考一下【实例截图】【核心代码】彩色图像分割└── 基于matlab的彩色图像的分割算法└── 公园与青椒的彩色图像分割├── pcnnseg│ └── PCNN彩色图像分割│…

ecshop api.php,ecshop2.72 api.php 文件鸡肋注入

/api.php.........................switch ($_POST[act]){case search_goods_list: search_goods_list(); break;//............................default: api_err(0x008, no this type api); //输出系统级错误:数据异常}.........................function search_goods_list(…

matlab 求解进度,报告测试运行进度的插件

在工作文件夹下的文件中,创建一个名为 cylinderPlotTest 的基于函数的测试。function tests cylinderPlotTesttests functiontests(localfunctions);endfunction setupOnce(testCase)testCase.TestData.Figure figure;addTeardown(testCase,close,testCase.TestD…

php 不喜欢用对象,为什么PHP不在其默认库中使用对象?

我已经用PHP编写了半年多的时间,虽然我还远没有成为一名专家,但我可以很容易地解决问题,并根据我的需要编写脚本.我来自面向对象的背景,这似乎是PHP在其默认库中使用的很少(如果有的话).我使用或创建的大多数外部库都使用面向对象的设计,而默认设置似乎使用下一个示例.我将使用…

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整体…

java终结者,动态语言是否会成为JAVA的终结者?

节选自《程序员》2006年第9期《茶杯里的风暴》一文,作者:金尹。如下:P2P网络向传统应用的渗透,将对Ruby、Python这些新兴的编程语言提出巨大的挑战。首先在P2P网络中单个运算节点上的程序并不需要像Web服务那样保持&am…

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

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

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

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

php7安装xhprof,PHP 7.1安装xhprof进行性能分析的介绍

这篇文章主要介绍了关于PHP 7.1安装xhprof进行性能分析的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下安装扩展该 xhprof扩展版本是从 https://github.com/longxinH/xhprof 获取的(第三方的一个库,官方版本不…

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

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

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

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