当前位置:服务器技术专区 → 正文

【服务器】PHP如何实现依赖注入?

责任编辑:zsheng |来源:企业网D1Net  2018-03-12 08:03:52 本文摘自:今日头条

 

【服务器】PHP如何实现依赖注入?

依赖注入(Dependency Injection,简称DI)又称控制反转(Inversion of Control,简称IOC),在目前的主流框架中,如ThinkPHP、Laravel等,都有实现。

什么是依赖注入呢?

举个简单的例子:

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。

第一种情况下,实例的调用者创建被调用的实例,必然要求被调用的类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,依赖注入容器自动提供被调用者实例。事实上,调用者和被调用者都处于依赖注入容器的管理下,二者之间的依赖关系由依赖注入容器提供。因此调用者与被调用者的耦合度进一步降低,这使得应用更加容易维护,这就是依赖注入所要达到的目的。

在PHP中如何实现依赖注入呢?

依赖注入在现在的编程中,有着比较突出的优势,这也是ThinkPHP、Laravel等框架,使用此编程思想的原因。那么这些框架到底是如何使用PHP去实现的呢?

下面我们使用一个简单的案例,来说说其中的奥秘。

首先我们创建一个类,看起来是这样的,包含一个属性和两个方:

【服务器】PHP如何实现依赖注入?

假设我们现在有另外两个类,redisDB和cache,redisDB提供一个redis数据库的操作,cache负责缓存功能的实现并且依赖于redisDB。如下:

【服务器】PHP如何实现依赖注入?

在上面这个类中我们简单实现了redis的查询、保存和删除。另一个类和当前这个类结构很像:

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

现在我们就当已经实现了redisDB和cache这两个组件,具体的细节这里就先不做讨论了,来看看如何使用使用吧。首先需要将两个组件注入到容器中:

【服务器】PHP如何实现依赖注入?

到这里你可能会觉得这样以来反而有点繁琐了。cache和redisDB的结构如此之像,完全可以把redis写到cache中而没必要单独分离出来?但是你想过没有,有些数据及时性没那么高而且数量比较大,用redis有点不合适,mongodb是更好的选择;有些数据更新频率更慢,对查询速度也没要求,直接写入文件保存到硬盘可能更为合适;再或者,你的客户觉得redis运维难度有点大,让你给他换成memcache... 这就是为什么把它分离出来了。然后,继续改进代码:

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

我们新增加了一个接口BackendInterface,规定了redisDB,mongoDB,file这三个类必须实现这个接口所要求的功能,至于其他锦上添花的功能,随你怎么发挥。而cache的代码,好像没有变,因为cache不需要关心数据是怎么存入数据库或者文件中。而cache的调用者,也不需要关心cache具体是怎么实现的,只要根据接口实现相应的方法就行了。多人协作你会更加受益,你们只需要商定好接口,然后分别实现就行了。

以上代码还可以继续改进,直到你认为无可挑剔为止。比如,redis服务在一个请求中可能会调用多次,而每次调用都会重新创建,这将有损性能。只需扩展一下DI容器就好增加一个参数或增加一个方法,随你。

【服务器】PHP如何实现依赖注入?

这样以来,如果某个服务在一次请求中要调用多次,你就可以将shared属性设置为true,以减少不必要的浪费。如果你觉得每次在注入时都要setDi有点繁琐,想让他自动setDi,那可以这么做:

【服务器】PHP如何实现依赖注入?

然后,就可以这样:

【服务器】PHP如何实现依赖注入?

我们现在所实现的这个DI容器还很简陋,还不支持复杂的注入,你可以继续完善它。不过,通过这些代码你已经了解什么是依赖在注入了,你可以将这种思想应用到你的项目中,或者着手开发你自己的框架。


关键字:服务器

本文摘自:今日头条

x 【服务器】PHP如何实现依赖注入? 扫一扫
分享本文到朋友圈
当前位置:服务器技术专区 → 正文

【服务器】PHP如何实现依赖注入?

责任编辑:zsheng |来源:企业网D1Net  2018-03-12 08:03:52 本文摘自:今日头条

 

【服务器】PHP如何实现依赖注入?

依赖注入(Dependency Injection,简称DI)又称控制反转(Inversion of Control,简称IOC),在目前的主流框架中,如ThinkPHP、Laravel等,都有实现。

什么是依赖注入呢?

举个简单的例子:

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。

第一种情况下,实例的调用者创建被调用的实例,必然要求被调用的类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,依赖注入容器自动提供被调用者实例。事实上,调用者和被调用者都处于依赖注入容器的管理下,二者之间的依赖关系由依赖注入容器提供。因此调用者与被调用者的耦合度进一步降低,这使得应用更加容易维护,这就是依赖注入所要达到的目的。

在PHP中如何实现依赖注入呢?

依赖注入在现在的编程中,有着比较突出的优势,这也是ThinkPHP、Laravel等框架,使用此编程思想的原因。那么这些框架到底是如何使用PHP去实现的呢?

下面我们使用一个简单的案例,来说说其中的奥秘。

首先我们创建一个类,看起来是这样的,包含一个属性和两个方:

【服务器】PHP如何实现依赖注入?

假设我们现在有另外两个类,redisDB和cache,redisDB提供一个redis数据库的操作,cache负责缓存功能的实现并且依赖于redisDB。如下:

【服务器】PHP如何实现依赖注入?

在上面这个类中我们简单实现了redis的查询、保存和删除。另一个类和当前这个类结构很像:

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

现在我们就当已经实现了redisDB和cache这两个组件,具体的细节这里就先不做讨论了,来看看如何使用使用吧。首先需要将两个组件注入到容器中:

【服务器】PHP如何实现依赖注入?

到这里你可能会觉得这样以来反而有点繁琐了。cache和redisDB的结构如此之像,完全可以把redis写到cache中而没必要单独分离出来?但是你想过没有,有些数据及时性没那么高而且数量比较大,用redis有点不合适,mongodb是更好的选择;有些数据更新频率更慢,对查询速度也没要求,直接写入文件保存到硬盘可能更为合适;再或者,你的客户觉得redis运维难度有点大,让你给他换成memcache... 这就是为什么把它分离出来了。然后,继续改进代码:

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

【服务器】PHP如何实现依赖注入?

我们新增加了一个接口BackendInterface,规定了redisDB,mongoDB,file这三个类必须实现这个接口所要求的功能,至于其他锦上添花的功能,随你怎么发挥。而cache的代码,好像没有变,因为cache不需要关心数据是怎么存入数据库或者文件中。而cache的调用者,也不需要关心cache具体是怎么实现的,只要根据接口实现相应的方法就行了。多人协作你会更加受益,你们只需要商定好接口,然后分别实现就行了。

以上代码还可以继续改进,直到你认为无可挑剔为止。比如,redis服务在一个请求中可能会调用多次,而每次调用都会重新创建,这将有损性能。只需扩展一下DI容器就好增加一个参数或增加一个方法,随你。

【服务器】PHP如何实现依赖注入?

这样以来,如果某个服务在一次请求中要调用多次,你就可以将shared属性设置为true,以减少不必要的浪费。如果你觉得每次在注入时都要setDi有点繁琐,想让他自动setDi,那可以这么做:

【服务器】PHP如何实现依赖注入?

然后,就可以这样:

【服务器】PHP如何实现依赖注入?

我们现在所实现的这个DI容器还很简陋,还不支持复杂的注入,你可以继续完善它。不过,通过这些代码你已经了解什么是依赖在注入了,你可以将这种思想应用到你的项目中,或者着手开发你自己的框架。


关键字:服务器

本文摘自:今日头条

电子周刊
回到顶部

关于我们联系我们版权声明隐私条款广告服务友情链接投稿中心招贤纳士

企业网版权所有 ©2010-2024 京ICP备09108050号-6 京公网安备 11010502049343号

^