php设计模式-依赖注入模式(Dependency Injection)
依赖注入模式用来减少程序间的耦合。
当一个类要使用另一个类时,一般的写法如下:
<?php
class Test1
{
public function say()
{
echo 'hello';
}
}
class Test2
{
public $test1;
public function communicate()
{
$this->test1 = new Test1();
$this->test1->say(); // 调用C类中的方法
//Do something else
}
}
$test2 = new Test2();
$test2->communicate();
当在Test2需要使用Test1时,Test2主动实例化了Test1类,很显然Test2类依赖Test1类,如果以后要修改Test1类的类名,必然要对Test2类做相应的修改,这样Test2类就和Test1类紧紧耦合在了一起。
如何降低这两个类之间的耦合行呢?看如下经过改造后的代码:
<?php
class Test1
{
public function say()
{
echo 'hello';
}
}
class Test2
{
public $test1;
public function __construct(Test1 $test1)
{
$this->test1 = $test1;//实例化c类
}
public function communicate()
{
$this->test1->say(); // 调用C类中的方法
//Do something else
}
}
$test1 = new Test1();
$test2 = new Test2($test1);
$test2->communicate();
Test2不再主动实例化Test1类,而是先创建一个Test1的对象,然后将Test1对象注入到Test2中,这种方法中如果Test1类发生改动,Test2类无需做相应的修改。这就是依赖注入模式的一种实现。依赖注入共有三种模式:构造方法注入,setter方法注入和接口注入。上面的例子就是构造方法注入。构造方法注入的弊端是Test2类依赖的类较多,实例化时参数列表会很长,容易发生混乱。
setter方法注入示例如下:
<?php
class Test1
{
public function say()
{
echo 'hello';
}
}
class Test2
{
public $test1;
public function setTest1(Test1 $test1)
{
$this->test1 = $test1;
}
public function communicate()
{
$this->test1->say(); // 调用C类中的方法
//Do something else
}
}
$test1 = new Test1();
$test2 = new Test2();
$test2->setTest1($test1)
$test2->communicate();
这种方式的弊端是当依赖的类增多时,需要很多的set方法。
另一种实现方法,同理只不过是吧construct改成了别的方法中实例化类了
<?php
/**
* 当有了IoC/DI的容器后,a类依赖c实例注入的示例
*/ /**
* Class c
*/
class c
{
public function say()
{
echo 'hello';
}
} /**
* Class a
*/
class a
{
private $c;
public function setC(C $c)
{
$this->c = $c; // 实例化创建C类
} public function sayC()
{
echo $this->c->say(); // 调用C类中的方法
}
} $c = new C();
$a = new a();
$a->setC($c);
$a->sayC();
php设计模式-依赖注入模式(Dependency Injection)的更多相关文章
- PHP程序员如何理解依赖注入容器(dependency injection container)
背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim ...
- 清晰架构(Clean Architecture)的Go微服务: 依赖注入(Dependency Injection)
在清晰架构(Clean Architecture)中,应用程序的每一层(用例,数据服务和域模型)仅依赖于其他层的接口而不是具体类型. 在运行时,程序容器¹负责创建具体类型并将它们注入到每个函数中,它使 ...
- Srping - bean的依赖注入(Dependency injection)
目录 1 概述 2 两种基本的依赖注入方式 2.1 构造函数方式 2.2Setter方式 3 其他依赖注入功能 3.1 <ref/>标签引用不同范围的bean 3.2 内部bean 3.3 ...
- 控制反转(Inversion of Control,英文缩写为IoC),另外一个名字叫做依赖注入(Dependency Injection,简称DI)
控制反转(Inversion of Control,英文缩写为IoC),另外一个名字叫做依赖注入(Dependency Injection,简称DI),是一个重要的面向对象编程的法则来削减计算机程序的 ...
- Scalaz(16)- Monad:依赖注入-Dependency Injection By Reader Monad
在上一篇讨论里我们简单的介绍了一下Cake Pattern和Reader Monad是如何实现依赖注入的.主要还是从方法上示范了如何用Cake Pattern和Reader在编程过程中解析依赖和注入依 ...
- 一文读懂Asp.net core 依赖注入(Dependency injection)
一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...
- 依赖注入(Dependency Injection)
Spring的两个核心内容为控制反转(Ioc)和面向切面(AOP),依赖注入(DI)是控制反转(Ioc)的一种方式. 依赖注入这个词让人望而生畏,现在已经演变成一项复杂的编程技巧 或设计模式理念.但事 ...
- ASPNET5 依赖注入(Dependency Injection)
依赖注入一直是asp.net web框架(Web API,SignalR and MVC)中不可或缺的一部分,但是在以前,这个框架都是各自升级,都有各自的依赖注入实现方式,即使Katana项目想通过O ...
- Sring控制反转(Inversion of Control,Ioc)也被称为依赖注入(Dependency Injection,DI)原理用反射和代理实现
首先我有一个数据访问层接口: public interface StudentDao { void save(Student stu); } 和实现类: 1.mysql实现类 public class ...
随机推荐
- 魔幻般冒泡背景的CSS3按钮动画
这是一款非常有特点的CSS3按钮,按钮的背景不是北京图片,也不是单纯的颜色,而是一组魔幻般的冒泡背景动画.当我们将鼠标滑过按钮时,按钮的冒泡背景动画就可以展示出来.可以说这款CSS3按钮的设计风格相当 ...
- CA 工作流程
散列函数 Hash 常见的有 MD5, SHA1, SHA256, 该类函数特点是函数单向不可逆,对输入非常敏感,输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完 ...
- jQuery效果之雪花飘落
实现思路 1.在一定的频率下在页面中生成一定数目的雪花从上往下飘落: 2.在指定的时间内飘落后移除页面: 3.可设置雪花的大小,在一定范围内随机雪花大小: 4.什么时间后清除生成雪花,停止函数. js ...
- Dynamics 365 Online-Virtual Entities
转载来源https://blogs.technet.microsoft.com/lystavlen/2017/09/08/virtual-entities/,使用当前Dynamics 365环境,亲测 ...
- JMeter 线程组之Stepping Thread Group插件介绍
线程组之Stepping Thread Group插件介绍 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 插件: https://jmeter-plu ...
- slice()和subString()
substring() 方法用于提取字符串中介于两个指定下标之间的字符.slice()返回一个子片段,对原先的string没有影响,与subString的区别是,还可以用负数当参数,相当于是lengt ...
- (办公)Mysql入门
数据库的操作:1.用 SHOW 显示已有的数据库show databases 2.创建数据库:create database 创建数据库create database db_name3.删除数据库:d ...
- event.target和event.currentTarget区别
首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素
- 基于Python3的漏洞检测工具 ( Python3 插件式框架 )
目录 Python3 漏洞检测工具 -- lance screenshot requirements 关键代码 usage documents Any advice or sugggestions P ...
- Visual Studio Team Services Demo Generator简介
Visual Studio Team Services Demo Generator简介 Visual Studio Team Services Demo Generator能够帮助我们在Visual ...