这篇文章介绍的内容是关于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 依赖倒置原则,PHP:依赖注入,控制反转,依赖倒置原则相关推荐

  1. 控制反转-依赖倒置-依赖注入

    控制反转:框架控制应用/组件 依赖倒置: 依赖注入:框架动态注入依赖关系到应用/组件 --------------------------------------------------------- ...

  2. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程...

    那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰--依赖倒置•控制反转•依赖注入•面向接口编程.也 ...

  3. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  4. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程【转】...

    那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰.也许时至今日,你仍对它们一知半解.不过就在今天, ...

  5. 高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

    今天,我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些"高深术语"中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. 高聚合·低耦合 简短:管理好自己(内聚),但是有 ...

  6. 【转】那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

    作者:在好 链接:https://www.zhihu.com/question/31021366/answer/102239756 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. 控制反转---依赖注入理解

    在学习Spring的时候,意外找到这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Ioc)和依赖注入(DI)刚听到感到很难理解,平时也程序 ...

  8. 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)

    前文 事件注入的想法是由依赖注入所联想到 依赖注入不算什么吸引人的话题 本篇就不详说了 不过有闲暇时间的机会不妨按照自己的兴趣去摸索.研究一些东西,也是一种乐子. 在抓虫系列里简单的描述一下依赖注入在 ...

  9. 设计模式——控制反转依赖注入

    一.控制反转: 从简单的代码示例入手: /// <summary>/// 邮件服务类/// </summary>public class EmailService{public ...

  10. laravel5.2总结--服务容器(依赖注入,控制反转)

    1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...

最新文章

  1. Java基础学习总结(6)——面向对象
  2. 一篇文章梳理完 AR 背后的八大关键性技术
  3. 使用c++进行Windows编程中各种操作文件的方法 【转】
  4. ubuntu18上安裝TeamViewer
  5. Execution failed for task ':compileArmv7DebugJavaWithJavac' 解决办法
  6. 浪潮linux网卡驱动,浪潮NF5280M5安装redhat7.2下网卡驱动
  7. mac查看端口,关闭进程
  8. 中国重汽微服务管理_springcloud微服务架构实战:商家管理微服务设计
  9. 爱奇艺怎么开启数据流量自动播放
  10. java 读取文件第一行代码,java文件读取。(单字节读取和按行读取读取)
  11. UNIDAC如何驱动MSSQL2000
  12. docker-compose安装镜像
  13. 使用ResourceBundle读取配置文件
  14. split(v1,v2)用于把一个字符串分割成字符串数组
  15. 《Python爬虫开发与项目实战》——第1章 回顾Python编程 1.1 安装Python
  16. Linux操作系统中netstat命令常见用法
  17. 私人订制,一份专属你的数据分析课程!
  18. centos服务器如何设置代理上网?
  19. Matplotlib库介绍
  20. HWADDR配置错误导致network重启失败处理

热门文章

  1. 过去式和过去分词的用法区别
  2. php判断4的倍数,4的倍数特征(4的倍数特征规律怎样找)
  3. k8s节点假死排查记录
  4. 用js转换joson返回数据库的时间格式为/Date(*************)/
  5. 后端和前端有什么区别,哪个工资高?
  6. 面试题33:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 * 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  7. 相关系数excel_如何求组内相关系数ICC?(应用篇)
  8. 怎么清理计算机磁盘空间,电脑磁盘空间不足怎么清理
  9. Excel 工作表密码破解
  10. SQL Server中自定义函数:用指定的分隔符号分割字符串