PHP控制反转和依赖注入的理解(通俗易懂)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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框架为例

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

  • 这是什么意思呢

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

  • 那么IoC是如何做的呢

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

5.DI(依赖注入)

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

        比如对象A需要操作数据库以前我们总是要在A中自己编写代码来获得一个Connection对象有了laravel我们就只需要告诉laravelA中需要一个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容器来建立它们之间的关系。 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php

“PHP控制反转和依赖注入的理解(通俗易懂)” 的相关文章