位置: 编程技术 - 正文

对PHP依赖注入的理解实例分析(php依赖注入的三种方式)

编辑:rootadmin

推荐整理分享对PHP依赖注入的理解实例分析(php依赖注入的三种方式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php 依赖,对php依赖注入的数据,php依赖注入的原理,对php依赖注入的数据,php依赖注入的三种方式,对php依赖注入的数据,php依赖注入的好处,php依赖注入的三种方式,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了对PHP依赖注入的理解。分享给大家供大家参考,具体如下:

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得!

首先,我们假设,我们要开发一个组件命名为SomeComponent。这个组件中现在将要注入一个数据库连接。

在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数。

为了解决上面所说的问题,我们需要在使用前创建一个外部连接,并注入到容器中。就目前而言,这看起来是一个很好的解决方案:

现在我们来考虑一个问题,我们在应用程序中的不同地方使用此组件,将多次创建数据库连接。使用一种类似全局注册表的方式,从这获得一个数据库连接实例,而不是使用一次就创建一次。

现在,让我们来想像一下,我们必须在组件中实现两个方法,首先需要创建一个新的数据库连接,第二个总是获得一个共享连接:

到此为止,我们已经看到了如何使用依赖注入解决我们的问题。不是在代码内部创建依赖关系,而是让其作为一个参数传递,这使得我们的程序更容易维护,降低程序代码的耦合度,实现一种松耦合。但是从长远来看,这种形式的依赖注入也有一些缺点。

例如,如果组件中有较多的依赖关系,我们需要创建多个setter方法传递,或创建构造函数进行传递。另外,每次使用组件时,都需要创建依赖组件,使代码维护不太易,我们编写的代码可能像这样:

我想,我们不得不在应用程序的许多地方创建这个对象。如果你不需要依赖的组件后,我们又要去代码注入部分移除构造函数中的参数或者是setter方法。为了解决这个问题,我们再次返回去使用一个全局注册表来创建组件。但是,在创建对象之前,它增加了一个新的抽象层:

这一刻,我们好像回到了问题的开始,我们正在创建组件内部的依赖,我们每次都在修改以及找寻一种解决问题的办法,但这都不是很好的做法。

一种实用和优雅的来解决这些问题,是使用容器的依赖注入,像我们在前面看到的,容器作为全局注册表,使用容器的依赖注入做为一种桥梁来解决依赖可以使我们的代码耦合度更低,很好的降低了组件的复杂性:

现在,该组件只有访问某种service的时候才需要它,如果它不需要,它甚至不初始化,以节约资源。该组件是高度解耦。他们的行为,或者说他们的任何其他方面都不会影响到组件本身。我们的实现办法

PhalconDI 是一个实现了服务的依赖注入功能的组件,它本身也是一个容器。

由于Phalcon高度解耦,PhalconDI 是框架用来集成其他组件的必不可少的部分,开发人员也可以使用这个组件依赖注入和管理应用程序中不同类文件的实例。

对PHP依赖注入的理解实例分析(php依赖注入的三种方式)

基本上,这个组件实现了 Inversion of Control 模式。基于此,对象不再以构造函数接收参数或者使用setter的方式来实现注入,而是直接请求服务的依赖注入。这就大大降低了整体程序的复杂性,因为只有一个方法用以获得所需要的一个组件的依赖关系。此外,这种模式增强了代码的可测试性,从而使它不容易出错。在容器中注册服务

框架本身或开发人员都可以注册服务。当一个组件A要求调用组件B(或它的类的一个实例),可以从容器中请求调用组件B,而不是创建组件B的一个实例。

这种工作方式为我们提供了许多优点:

我们可以更换一个组件,从他们本身或者第三方轻松创建。在组件发布之前,我们可以充分的控制对象的初始化,并对对象进行各种设置。

我们可以使用统一的方式从组件得到一个结构化的全局实例服务可以通过以下几种方式注入到容器:

在上面的例子中,当向框架请求访问一个请求数据时,它将首先确定容器中是否存在这个”reqeust”名称的服务。

容器会反回一个请求数据的实例,开发人员最终得到他们想要的组件。在上面示例中的每一种方法都有优缺点,具体使用哪一种,由开发过程中的特定场景来决定的。

用一个字符串来设定一个服务非常简单,但缺少灵活性。设置服务时,使用数组则提供了更多的灵活性,而且可以使用较复杂的代码。lambda函数是两者之间一个很好的平衡,但也可能导致更多的维护管理成本。

PhalconDI 提供服务的延迟加载。除非开发人员在注入服务的时候直接实例化一个对象,然后存存储到容器中。在容器中,通过数组,字符串等方式存储的服务都将被延迟加载,即只有在请求对象的时候才被初始化。

以上这两种服务的注册方式产生相同的结果。然后,通过数组定义的,在后面需要的时候,你可以修改服务参数:

从容器中获得服务的最简单方式就是使用”get”方法,它将从容器中返回一个新的实例:

或者通过下面这种魔术方法的形式调用:

PhalconDI 同时允许服务重用,为了得到一个已经实例化过的服务,可以使用 getShared() 方法的形式来获得服务。具体的 PhalconHttpRequest 请求示例:

参数还可以在请求的时候通过将一个数组参数传递给构造函数的方式:

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

SAE实时日志接口SDK用法示例 本文实例讲述了SAE实时日志接口SDK用法。分享给大家供大家参考,具体如下:新浪SAE是新浪研发中心开发的国内首个公有云平台,从年开始到现在也

PHP对象链式操作实现原理分析 本文实例讲述了PHP对象链式操作实现原理。分享给大家供大家参考,具体如下:什么是链式操作呢使用jQuery的同学印象应该会很深刻.在jQuery中,我们经常

Ajax实现对静态页面的文章访问统计功能示例 本文实例讲述了Ajax实现对静态页面的文章访问统计功能。分享给大家供大家参考,具体如下:众所周知,静态页面不仅速度快,而且对seo也有一定的帮

标签: php依赖注入的三种方式

本文链接地址:https://www.jiuchutong.com/biancheng/301781.html 转载请保留说明!

上一篇:mac下多个php版本快速切换的方法(mac apache php)

下一篇:SAE实时日志接口SDK用法示例(ahs日志)

  • 纳税检查调整的销售额确认收入吗
  • 普通发票作废要收回吗
  • 利息可以抵税是什么意思
  • 专票上不小心印上字了,怎么去除
  • 小规模零税率申报流程
  • 待处理财产损益借贷方向
  • 消防管理费用收取标准
  • 开票不确认收入可以吗
  • 工会经费计税基数包含支付职工的辞退福利
  • 高管个人所得税政策
  • 资本化研发费用在本年的摊销
  • 租赁行业的增值税税率
  • 进项转出再差额征收待抵扣
  • 无偿受让股权的股东对发起股东没有出资承担责任
  • 雇主责任险能否证明劳动关系
  • 税局未核定印花税一直没有交怎么办
  • 工程项目产生的沙石怎么处理
  • 个税跨年的可以补报吗
  • 供应商已注销欠的发票怎么办?
  • 汽车加油票可以开专票吗
  • 所有者权益为什么是负债
  • 增值税普通发票和电子普通发票的区别
  • win10夜间模式怎么打开不了
  • html5 video标签
  • linux怎么翻译
  • 电脑怎么一键返回到桌面
  • php数组函数输出《咏雪》里有多少"片"字
  • 认缴制没有实资本会怎么样
  • 展位费一般多少钱
  • 为员工租赁房屋产生的租赁费可以抵扣增值税和所得税吗
  • 什么是董事会费
  • php://filter协议
  • 甲公司购入一台入账价值为200万元的生产设备
  • 目标检测算法的主要目的是找到图像中用户感兴趣的
  • php第三方包
  • vue组件继承element并重写方法
  • vue-cli-service权限不够
  • 股权转让税收规定
  • 房产税收特点有哪些
  • python中事件处理的方法
  • js reverse
  • 咨询公司业务流程
  • 如何开具通用电子发票
  • db2pd 命令
  • mysql将两个查询结果合并到一起
  • 一般纳税人企业所得税税率2023
  • 其他应付款怎么冲平影响会计利润吗
  • 营改增后建筑企业税负
  • 公司注销实收资本要清零吗?
  • 账外资产处理
  • 坏账准备的核算公式
  • 押金是否可以抵扣租金
  • 虚开发票但是没有成本如何做账?
  • 减免所得税额a201030怎么填
  • 可供出售金融资产属于什么科目
  • 银行记账本怎么填写
  • SQLSERVER 中datetime 和 smalldatetime类型分析说明
  • win8切换管理员账户
  • windows8正在准备windows
  • linux文件批处理命令
  • win8图标大小怎么调
  • javascript入门教程
  • cocos2dx schedule
  • android view动画
  • 一个简单的灵魂
  • android开发范例实战宝典
  • uploadify上传无反应
  • Python通过DOM和SAX方式解析XML的应用实例分享
  • python随机发红包代码
  • 从局部变量和全变量区分
  • python中for循环写法
  • 新疆税务局电子
  • 供暖配套费
  • 西安国家税务局丁雁现任命职务
  • 北京公积金缴纳最低基数
  • 小规模开了红字发票申报表怎么填
  • 四川4050社保补贴政策什么时候发放
  • 厦门市税务局电话
  • 关于车辆购置税的规定,下列说法正确的是
  • 四川省成都市地图高清版大图
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设