php---依赖倒转(反转控制)原则
一、简介
依赖注入和控制反转说的实际上是同一个东西,它们是一种设计模式,这种设计模式用来减少程序间的耦合
优点:使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活
依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高。而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。意为上层代码定义接口,下层代码实现该接口,从而使得下层依赖于上层接口,降低耦合度,提高系统弹性
二、问题
具有紧耦合关系的代码,往往迁一发而动全身。例如:
<?php
// dog 类
class dog {
public function eat(){
echo '骨头';
}
public function speak(){
echo '旺旺';
}
}
//cat 类
class cat {
public function eat(){
echo '鱼';
}
public function speak(){
echo '喵喵';
}
} // BeastTraining 类
class BeastTraining{
private $animal;
public function __construct($animal){
if ($animal == 'dog'){
$this->animal = new dog();
} else {
$this->animal = new cat();
}
}
public function eat(){
$this->animal->eat();
}
public function speak(){
$this->animal->speak();
}
} $animal = new BeastTraining('dog');
$animal->eat();
上面的 BeastTraining 类与 dog 类 和 cat 类存在着紧耦合的关系,一旦dog类和cat 需要修改了eat方法,那么 BeastTraining 类也就要做相应的调整。或者又添加一个与cat 类相似的类,那此时有该怎么办呢?
三、解决方案
以上的问题在于高层的代码(BeastTraining)依赖于底层的代码(dog 类或cat类),不利于代码的复用。如何减少对底层代码的依赖?解决方案:
<?php
interface animal{ # 定义好接口
public function eat();
public function speak();
} // dog 类
class dog implements animal { # 实现接口类的 所有方法
public function eat(){
echo '骨头';
}
public function speak(){
echo '旺旺';
}
}
//cat 类
class cat implements animal{ # 实现接口的所有方法
public function eat(){
echo '鱼';
}
public function speak(){
echo '喵喵';
}
} // BeastTraining 类
class BeastTraining{
private $animal;
public function __construct(animal $animal){ # 传输实现接口的类
$this->animal = $animal;
}
public function eat(){
$this->animal->eat();
}
public function speak(){
$this->animal->speak();
}
} $animal = new BeastTraining(new cat());
$animal->eat();
或者
<?php
abstract class animal{
protected $status = 0;
public function get_status()
{
echo $this->status;
}
abstract public function eat();
abstract public function speak();
} // dog 类
class dog extends animal {
public $status=1;
public function eat(){
echo '骨头';
}
public function speak(){
echo '旺旺';
}
}
//cat 类
class cat extends animal{
public $status=1;
public function eat(){
echo '鱼';
}
public function speak(){
echo '喵喵';
}
} // BeastTraining 类
class BeastTraining{
private $animal;
public function __construct(animal $animal){
$this->animal = $animal;
}
public function eat(){
$this->animal->eat();
}
public function speak(){
$this->animal->speak();
}
public function get_status(){
$this->animal->get_status();
}
} $animal = new BeastTraining(new cat());
$animal->eat();
$animal->get_status();
上面两个代码案例其实是一样的,都解决了高层代码(BeastTrainnig 类)对底层代码(dog ,cat类)的依赖。通过对接口的定义。使底层代码符合接口规范,而高层代码又无需了解底层代码的实现过程。实现了高层代码与底层代码的解耦。
四、图解

五、总结
1、高层模块不应该依赖于底层模块,两个都应该依赖于抽象
2、抽象不应该依赖于细节,细节应该依赖于抽象
不足之处,请多多指教。
php---依赖倒转(反转控制)原则的更多相关文章
- 设计模式原则——依赖倒转&里氏代换原则
设计模式一共有六大原则: 单一原则.开放封闭原则.接口分离原则.里氏替换原则.最少知识原则.依赖倒置原则. 这篇博客是自己对依赖倒转&里氏代换原则的一些拙见,有何不对欢迎大家指出. 依赖倒转原 ...
- PHP 依赖注入和控制反转再谈(二)
今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我 ...
- java依赖的斗争:依赖倒置、控制反转和依赖注入
控制反转(Inversion Of Controller)的一个著名的同义原则是由Robert C.Martin提出的依赖倒置原则(Dependency Inversion Principle),它的 ...
- PHP依赖倒置和控制反转
判断代码的好坏,我们有自己的标准:高内聚,低耦合.为了解决这一问题,php中有许多优秀的设计模式,比如工厂模式,单例模式. 而在代码中体现出来的设计模式,就如依赖注入和控制反转. 那什么是依赖注入? ...
- 依赖注入 DI 控制反转 IOC MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
- 依赖注入 DI 控制反转 IOC 概念 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 浅谈(IOC)依赖注入与控制反转(DI)
前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...
- 理解 PHP 依赖注入 和 控制反转
理解 PHP 依赖注入 和 控制反转 要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题: DI -- Dependency Injection 依赖注入 IoC -- ...
随机推荐
- OpenCV : 基于切线方向的边缘增强算法
使用切线方法,对切线方向上的边缘进行强化: 参考连接:图像锐化和边缘检测 代码: //在种子点方向上寻找合适的梯度,用于寻找边缘 //对low_Gray, high_gray之间的点寻找边缘 void ...
- 【sqli-labs】 less22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)
注入的过程和less 20 21一样,这次闭合cookie的使用的双引号
- sql server time(7) 默认值
语句为 ALTER TABLE dbo.YourTable ADD CONSTRAINT DF_TimeDefault DEFAULT '00:00:00' FOR YourTimeColumn 比如 ...
- JDK8新特性:Lambda表达式
Lambda表达式,案例一:new Thread(() -> System.out.println("thread")); Lambda表达式,案例二:由参数/箭头和主体组成 ...
- elasticsearch重建索引
1.重建索引 一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中 批量 ...
- Day 20 python基础总复习
一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...
- 洛谷P1781 宇宙总统【排序+字符串】
地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 输入输出格式 输入格式: president.in 第一行为一个 ...
- [tyvj1957 Poetize5] Vani和Cl2捉迷藏 (最小路径可重点覆盖+二分图最大匹配)
传送门 Description 这片树林里有N座房子,M条有向道路,组成了一张有向无环图. 树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔.如果从房子A沿着路走下去能够到达B,那么在 ...
- 使用Layer完成图片放大功能
序言:在写这个功能之前也用了zoom.js,zoom.js用起来简单引用js然后设置图片属性就可以放大.但是放大后的图片模糊.没有遮罩.在放大图片时其它图片布局会受到影响,当然如果觉得这些都是小问题的 ...
- mongodb--update高级用法
配合update使用的函数 $set 修改某列的值 $unset 删除某个列 $rename 重命名某个列 $inc 增长某个列 $setOnInsert 当upsert为true时,并且发生了ins ...