PHP控制反转和依赖注入的理解(通俗易懂)
创始人
2024-05-23 08:22:15
0

目录

1.IoC是什么

2.IoC能做什么

3.IoC和DI

4.IoC(控制反转)

5.DI(依赖注入)

6.我对IoC(控制反转)和DI(依赖注入)的理解


学习PHP各个框架的过程中,都会听过IoC(控制反转) 、DI(依赖注入)这两个概念,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天跟大家分享网上的一些技术大牛们对IOC的理解以及谈谈我的理解。

1.IoC是什么

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下: 

  • 谁控制谁,控制什么:
  1. 正常PHP程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
  2. 为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
  • 传统程序设计如下图所示

都是主动去创建相关对象然后再组合起来

  • 当有IoC/DI容器后,程序结构示意如下图所示

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了

2.IoC能做什么

  1. IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
  2. 其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
  3. IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

3.IoC和DI

DI—Dependency Injection,即“依赖注入”组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

  理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下

  1. ●谁依赖于谁:当然是应用程序依赖于IoC容器
  2. ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源
  3. ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象
  4. ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

IoC和DI由什么关系呢?

  1. 其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

4.IoC(控制反转)

  • 以laravel框架为例:

        首先说说IoC(Inversion of Control,控制反转)对于laravel框架来说,就是由laravel来负责控制对象的生命周期和对象间的关系。

  • 这是什么意思呢?

        举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。

  • 那么IoC是如何做的呢?

        有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。laravel所倡导的开发方式就是如此,所有的类都会在laravel容器中登记,告诉laravel你是个什么东西,你需要什么东西,然后laravel会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 laravel来控制,也就是说控制对象生存周期的不再是引用它的对象,而是laravel。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被laravel控制,所以这叫控制反转。

5.DI(依赖注入)

        IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

        比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了laravel我们就只需要告诉laravel,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,laravel会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由laravel注入到A中的,依赖注入的名字就这么来的。

  理解了IoC和DI的概念后,一切都将变得简单明了,剩下的工作只是在laravel的框架中堆积木而已。

6.我对IoC(控制反转)和DI(依赖注入)的理解

        在平时的PHP应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时,至少需要两个或以上的对象来协作完成,在没有使用框架(laravel)的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来。

        这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了。

        例如:A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了框架(laravel)之后就不一样了,创建合作对象B的工作是由(laravel)来做的。

        过程:laravel创建好B对象以后,然后存储到一个容器里面,当A对象需要使用B对象时,laravel就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到框架(laravel)给我们的对象之后,两个人一起协作完成要完成的工作即可。 

  • 所以控制反转IoC(Inversion of Control)是说:

        创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。 

相关内容

热门资讯

校歌比赛作文500字 校歌比赛作文500字  上个星期五,学校举行了最后一个集体比赛活动——“千人齐唱校歌”。  那天上午...
老鼠和老虎作文 老鼠和老虎作文老鼠和老虎作文1   20xx年12月23日 星期三 晴  一天,一只小老...
蜘蛛侠作文800字 蜘蛛侠作文800字·性格豪放,好动。喜欢爬大铁门,杨老师送我个雅号“蜘蛛侠”,我觉得这个美誉用在我身...
请医生作文 请医生作文请医生作文1XX年08月27日 星期六 天气:晴小兔正在路上散步,小松鼠急急忙忙地向他走来...
寻作文500字 寻作文500字(精选20篇)  在平平淡淡的日常中,大家或多或少都会接触过作文吧,作文可分为小学作文...
奥运的作文 奥运的作文(集合15篇)  在日常的学习、工作、生活中,许多人都有过写作文的经历,对作文都不陌生吧,...
《白雪公主》续 《白雪公主》续             可恶的巫婆——白雪公主的继母,她毕竟是个巫婆.在白雪公主和王...
最后的时刻作文 最后的时刻作文最后的时刻作文1  “还有四十五分钟就要交卷了”,我心里默念着,手心里冒出了细微的汗。...
华罗庚的小故事 华罗庚的小故事100字(精选5篇)  华罗庚是我国伟大的数学家,下面是小编整理的华罗庚的相关故事。希...
小动物的作文 400字 关于小动物的作文 400字(通用24篇)  无论在学习、工作或是生活中,大家或多或少都会接触过作文吧...
我的新同学作文600字 我的新同学作文600字(通用22篇)  在日常学习、工作或生活中,大家总少不了接触作文吧,借助作文可...
在路上优秀作文 在路上优秀作文(精选14篇)  在生活、工作和学习中,大家都跟作文打过交道吧,作文是人们以书面形式表...
生命的作文 生命的作文(通用8篇)  在平时的学习、工作或生活中,大家都经常看到作文的身影吧,通过作文可以把我们...
氧吧小台灯作文 氧吧小台灯作文  无论是在学校还是在社会中,大家对作文都再熟悉不过了吧,作文根据体裁的不同可以分为记...
幸运草作文 幸运草作文幸运草500字  我每天看着自己窗外碧绿的植物,心想:植物是怎么长出来的呢?我就想自己种植...
磨练意志的作文 关于磨练意志的作文  关于磨练意志的作文【1】  有的人老是管不住自己,容易被一些事情所诱惑;有的人...
做豆酱饼作文 做豆酱饼作文  美食是一种艺术,这种艺术的背后有许多鲜为人知的小吃。虽说算不上艺术,但却体现了个地方...
龙眼的传说1000字作文 龙眼的传说1000字作文  很久很久以前,天上有一条恶龙,每隔三年便下凡到福清骚扰百姓,为害生灵。虞...
学会感恩作文500字 有关学会感恩作文500字9篇  在日常的学习、工作、生活中,大家总免不了要接触或使用作文吧,借助作文...
写人写事作文600字 写人写事作文600字(精选61篇)  说到作文,大家肯定都不陌生吧,尤其是写人作文,写人作文是以表现...