PHP依赖倒置和控制反转
判断代码的好坏,我们有自己的标准:高内聚,低耦合。为了解决这一问题,php中有许多优秀的设计模式,比如工厂模式,单例模式。
而在代码中体现出来的设计模式,就如依赖注入和控制反转。
那什么是依赖注入?
简单来说,就是把A类所依赖的B类C类等以属性或者构造函数等方式注入A类而不是直接在A类中实例化。
一般写代码我们这样写
class EmailSendByQq {
public function send(){
}
}
class User(){
public function register(){
$email = new EmailSendByQq();
$email->send();
}
}
调用User类的register注册方法,实例化Email类发送邮件。可以看到User类依赖EmailSendByQq类,没有它User类就发送不了邮件,但是如果我们不想用QQ邮箱转而用163(EmailSendBy163)呢,就需要在一个个类中修改EmailSendByQq的实例化,如果使用控制反转对这两个类进行解耦,应该会好一点
class User {
private $_emailSendObject;
public function __construct($emailSendObject)
{
$this->_emailSendObject = $emailSendObject;
}
public function register(){
$this->_emailSendObject->send();
}
}
$emailSendObject = new EmailSendByQq;
$user = new User($emailSendObject);
$user->register();
//以属性的方式同样也可以实现
class EmailSendBy163 {
public function send(){
}
}
class User{
public $emailSendObject;
public function register(){
$this->emailSendObject->send();
}
}
$user = new User;
$user->emailSendObject = new EmailSendBy163();
$user->register();
上面通过构造函数和属性的方法传递对象的过程,就是依赖注入的体现。
“注入”就是把一个实例传到另一个实例内部。 接下来继续把上面的代码优化,简单工厂模式的体现。
//通过EmailSendByQq和EmailSendBy163类,我们提炼出一个interface接口,让User类register方法依赖于interface接口的对象看起来更合适
interface EmailSender{
public function send();
}
class EmailSendByQq implements EmailSender{
public function send(){ }
}
class EmailSendBy163 implements EmailSender{
public function send()
{
// TODO: Implement send() method.
}
}
class User{
public $emailSenderClass;
public function __construct(EmailSender $emailSenderObject)
{
$this->emailSenderClass = $emailSenderObject;
}
public function register(){
$this->emailSenderClass->send();
}
}
$user = new User(new EmailSendBy163);
$user->register();
这样便实现了解耦。
依赖倒置原则(Dependence Inversion Principle, DIP),是一种软件设计思想。传统软件设计中,上层代码依赖于下层代码,当下层出现变动时, 上层代码也要相应变化,维护成本较高。而DIP的核心思想是上层定义接口,下层实现这个接口, 从而使得下层依赖于上层,降低耦合度,提高整个系统的弹性。这是一种经实践证明的有效策略。
PHP依赖倒置和控制反转的更多相关文章
- java依赖的斗争:依赖倒置、控制反转和依赖注入
控制反转(Inversion Of Controller)的一个著名的同义原则是由Robert C.Martin提出的依赖倒置原则(Dependency Inversion Principle),它的 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- .NET Core的依赖注入[1]: 控制反转
写在前面:我之前写过一系列关于.NET Core依赖注入的文章,由于.NET Core依赖注入框架的实现原理发生了很大的改变,加上我对包括IoC和DI这些理论层面的东西又有了一些新的理解,所以我在此基 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:控制反转
ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- 简单解析依赖注入(控制反转)在Spring中的应用
IoC——Inversion of Control 控制反转DI——Dependency Injection 依赖注入 大家都知道,依赖注入是Spring中非常重要的一种设计模式.可能很多初学者 ...
- 谈谈php依赖注入和控制反转
要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题: DI--Dependency Injection 依赖注入 IoC--Inversion of Control 控制反转 1. ...
- Java的依赖注入(控制反转)
两个主角"依赖注入"和"控制反转": 1.二都说的都是同一件事,只是叫法不同.是一个重要的面向对象编程的法则,也是一种设计模式: 2.英文原称:依赖注入,Dep ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
随机推荐
- Scrum Meeting 9
第九次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...
- Linux内核及分析 第五周 扒开系统调用的三层皮(下)
实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...
- 20135337——Linux内核分析:第十七章 模块与设备
第17章 模块与设备 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向对象的简单操作 ...
- Python学习笔记 --第二章
Python语法基础 "#"号为注释符,建议缩进四个空格,Python大小写敏感. 数据类型 整数 0,2等等,以0x开头的为十六进制数 浮点数 1.58e9 字符串 用'或"括起来的任意文 ...
- PAT 1014 福尔摩斯的约会
https://pintia.cn/problem-sets/994805260223102976/problems/994805308755394560 大侦探福尔摩斯接到一张奇怪的字条:“我们约会 ...
- java的OutOfMemoryError: PermGen space实战剖析
由Word导出为PDF,导致java.lang.OutOfMemoryError: PermGen space 永生代空间不足,导致内存溢出,用jvisualvm监控了一下,永生代默认值80~90M, ...
- html5應用緩存
HTML5使用了應用緩存,就是web應用緩存,使得在離線狀態下可以訪問web'應用. 應用緩存的優點: 離線訪問-可以在無網的狀態下訪問應用 速度-有緩存的應用加載更快 瀏覽器負載-瀏覽器只從服務器加 ...
- selenium之截图
selenium支持对当前页面保存截图,使用方法: driver.get_screenshot_as_file(file_path) 代码举例: ...... def get_screenshot(d ...
- SOC四大弱点分析
导读 今年的年度安全运营中心(SOC)调查中,SANS研究所指出了4个最为常见的SOC弱点.这些弱点的根源可被追溯到我们非常熟悉的人.过程.适度规划和技术实现上.下面我们就来看看SOC的四大弱点究竟是 ...
- ansible系列3-pyYAML
规则一:缩进 yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成.一定不能使用tab键 注意:编写yaml文件,就忘记键盘有tab 规则二:冒号 CMD ...