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 ...
随机推荐
- jQuery效果之jQuery Color animation 色彩动画扩展
jQuery 的动画方法(animate)支持各种属性的过渡,但是默认并不支持色彩的过渡,该插件正是来补足这一点! PS: 该插件支持 RGBA 颜色的过渡,但是请注意,IE8以下的版本不支持 RGB ...
- JS单体内置对象之Math常用方法(min,max,ceil,floor,round,random等)
1.min()和max()方法 Math.min()用于确定一组数值中的最小值.Math.max()用于确定一组数值中的最大值. alert(Math.min(2,4,3,6,3,8,0,1,3)); ...
- CentOS-7.2安装Ambari-2.6.1
CentOS-7.2安装Ambari-2.6.1 一.Ambari 是什么? Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目, ...
- Ubuntu添加新分区
1.查看分区 ~$ sudo fdisk -l 2.添加分区 ~$ fdisk /dev/sda 3.输入m查看帮助 ~$ m 4.输入n新建分区,即添加分区 ~$ n 这里会出现设置分区大小 5.输 ...
- wap2app(一)-- 网站快速打包成app
工具:HBuilder,下载地址:http://www.dcloud.io/ 下载并安装HBuilder后,打开编辑器,选择:文件 -> 新建 -> 项目,出现如下图: 选择wap2app ...
- RESTful相关理解
just 一种接口规范,写法种类不止一种 类似python的那啥标准
- [转] Scala 中的异步事件处理
在任何并发性应用程序中,异步事件处理都至关重要.无论事件的来源是什么(不同的计算任务.I/O 操作或与外部系统的交互),您的代码都必须跟踪事件,协调为响应它们而执行的操作.应用程序可以采用两种基本方法 ...
- SQL强化练习(面试与学习必备)
一.经典选课题A 1.1.请同时使用GUI手动与SQL指令的形式创建数据库.表并添加数据. 题目:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教 ...
- 语句调优基础知识-set statistics profile on
set statistics profile on 获取语句真实的执行计划信息 set statistics profile on go select distinct Productid,unitp ...
- 9. svg学习笔记-裁剪和蒙版
裁剪 在svg中进行剪切,对整个svg元素而言,可以使用<svg>元素的viewbox属性,对于单个元素则可以使用<clipPath>元素.在单个图形元素上使用裁剪,可以在&l ...