位置: 编程技术 - 正文

PHP依赖注入(DI)和控制反转(IoC)详解(thinkphp6依赖注入)

编辑:rootadmin

推荐整理分享PHP依赖注入(DI)和控制反转(IoC)详解(thinkphp6依赖注入),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php 依赖注入,php依赖注入在框架中的使用,PHP依赖注入实现原理,php容器依赖注入的原理,php依赖注入在框架中的使用,php依赖注入在框架中的使用,php依赖注入的三种方式,PHP依赖注入实现原理,内容如对您有帮助,希望把文章链接给更多的朋友!

首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量。

首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描述,充斥着大量的生涩词汇,要么就是java代码描述的,也生涩。

不管怎么样,总算弄清楚一些了,下面就以php的角度来描述一下依赖注入这个概念。

先假设我们这里有一个类,类里面需要用到数据库连接,按照最最原始的办法,我们可能是这样写这个类的:

过程:

在构造函数里先将数据库类文件include进来;然后又通过new Db并传入数据库连接信息实例化db类;之后getList方法就可以通过$this->_db来调用数据库类,实现数据库操作。

看上去我们实现了想要的功能,但是这是一个噩梦的开始,以后example1,example2,example3....越来越多的类需要用到db组件,如果都这么写的话,万一有一天数据库密码改了或者db类发生变化了,岂不是要回头修改所有类文件?ok,为了解决这个问题,工厂模式出现了,我们创建了一个Factory方法,并通过Factory::getDb()方法来获得db组件的实例:

sample类变成:

这样就完美了吗?再次想想一下以后example1,example2,example3....所有的类,你都需要在构造函数里通过Factory::getDb();获的一个Db实例,实际上你由原来的直接与Db类的耦合变为了和Factory工厂类的耦合,工厂类只是帮你把数据库连接信息给包装起来了,虽然当数据库信息发生变化时只要修改Factory::getDb()方法就可以了,但是突然有一天工厂方法需要改名,或者getDb方法需要改名,你又怎么办?当然这种需求其实还是很操蛋的,但有时候确实存在这种情况,一种解决方式是:

PHP依赖注入(DI)和控制反转(IoC)详解(thinkphp6依赖注入)

我们不从example类内部实例化Db组件,我们依靠从外部的注入,什么意思呢?看下面的例子:

这样一来,example类完全与外部类解除耦合了,你可以看到Db类里面已经没有工厂方法或Db类的身影了。我们通过从外部调用example类的setDb方法,将连接实例直接注入进去。这样example完全不用关心db连接怎么生成的了。这就叫依赖注入,实现不是在代码内部创建依赖关系,而是让其作为一个参数传递,这使得我们的程序更容易维护,降低程序代码的耦合度,实现一种松耦合。

这还没完,我们再假设example类里面除了db还要用到其他外部类,我们通过:

我们没完没了的写这么多set?累不累&#;ok,为了不用每次写这么多行代码,我们又去弄了一个工厂方法:

实例化example时变为:

似乎完美了,但是怎么感觉又回到了上面第一次用工厂方法时的场景?这确实不是一个好的解决方案,所以又提出了一个概念:容器,又叫做IoC容器、DI容器。

我们本来是通过setXXX方法注入各种类,代码很长,方法很多,虽然可以通过一个工厂方法包装,但是还不是那么爽,好吧,我们不用setXXX方法了,这样也就不用工厂方法二次包装了,那么我们还怎么实现依赖注入呢?这里我们引入一个约定:在example类的构造函数里传入一个名为Di $di的参数,如下:

Di就是IoC容器,所谓容器就是存放我们可能会用到的各种类的实例,我们通过$di->set()设置一个名为db的实例,因为是通过回调函数的方式传入的,所以set的时候并不会立即实例化db类,而是当$di->get('db')的时候才会实例化,同样,在设计di类的时候还可以融入单例模式。

这样我们只要在全局范围内申明一个Di类,将所有需要注入的类放到容器里,然后将容器作为构造函数的参数传入到example,即可在example类里面从容器中获取实例。当然也不一定是构造函数,你也可以用一个 setDi(Di $di)的方法来传入Di容器,总之约定是你制定的,你自己清楚就行。

这样一来依赖注入以及关键的容器概念已经介绍完毕,剩下的就是在实际中使用并理解它吧!

PHP中关键字interface和implements详解 PHP接口PHP类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此PHP引入了类的接口技术。如果一个抽象类里面的

PHP中phar包的使用教程 前言PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。首先需要修改php.ini配置将phar的readonly关闭,默认是不能写phar包的,i

php实现的二叉树遍历算法示例 本文实例讲述了php实现的二叉树遍历算法。分享给大家供大家参考,具体如下:今天使用php来实现二叉树的遍历创建的二叉树如下图所示php代码如下所

标签: thinkphp6依赖注入

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

上一篇:PHP正则删除HTML代码中宽高样式的方法(php中正则表达式)

下一篇:PHP中关键字interface和implements详解(php中关键字修饰属性是什么)

  • 纳税人未缴少缴税款
  • 不得从销项税中抵扣的进项税大白话
  • 增值税附加税是几个点
  • 银行应发贷款和实际收到的贷款为什么不一致
  • 企业所得税资产总额怎么计算
  • 税控盘减免税额转出会计分录
  • 购进的库存商品转自用需要开发票吗
  • 合法有效的凭证
  • 哪些依据属于会计凭证
  • 门诊药房主要业务
  • 留抵税额抵减欠税文件
  • 工商不变新股东是什么
  • 划拨土地使用权多少年
  • 美金公户打入个人账户
  • 公司办公楼的中介怎么做
  • 哪些情况下需要更换轮胎
  • 发票章盖住备注烂备注的日期,看不清
  • 给客户的回扣做账时怎么写情况说明
  • 合同税率16%调整到13%怎么算
  • 金蝶采购发票怎么红冲
  • 转账支票用途可以写劳务费吗
  • 合并报表抵消分录实例
  • 自主研发全流程
  • 公司转账到支付宝有记录么
  • php参数过滤封装类
  • php中的变量都以什么开头
  • 固定资产原值和账务账套原值不平
  • 为实习生支付人身意外伤害保险如何进行账务处理?
  • 房贷贷款利息计算
  • PQIBrowser.exe是什么进程 PQIBrowser进程查询
  • 其他应收款和其他应付款常常被用作抵消
  • PHP:imagecopymerge()的用法_GD库图像处理函数
  • 企业所得税税前扣除和不扣除的区别
  • 仙岩寺庙
  • php命名空间和自由空间
  • php实现递归
  • 工装进福利费还是劳保费
  • 职工参加生育保险
  • 工会经费和残保金怎么做账
  • 闭包 python
  • 推荐最好用的
  • python 微信红包
  • php执行另一个php
  • 国税网如何下载申报后的财务报表
  • 进项发票和销项发票统计
  • 简易记账和复式记账
  • 个人账户收到多少钱会被监控
  • PostgreSQL分区表(partitioning)应用实例详解
  • 房地产公司计提税金
  • 会计人员信息采集怎么填
  • 不认证的发票可以作废吗
  • sql server新增数据
  • 公司没有收入怎么办
  • 账务处理程序的定义
  • 预缴增值税需要提供什么资料
  • 会计库存商品属于什么科目
  • 政府补贴资金如何记账
  • 包工包料工程如何计税
  • 母子公司可以合并吗
  • mysql安装出问题
  • windows8关机在哪里
  • linux系统中
  • linux监控软件zabbix
  • 计算机无法从休眠
  • js让按钮不能点击
  • cocos2dx游戏有哪些
  • cocos2dx4.0入门
  • 相机跟随人物移动
  • android中的短信联系人管理,浏览器属于
  • jquery fadein不起作用
  • Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
  • javascript object oriented 面向对象编程初步
  • 咸阳国税局长是哪里人
  • 餐饮商家怎么开通抖音团购
  • 税务局每月征期是什么时候
  • 留抵税额如何抵扣
  • 税务行政执法风险防范与控制
  • 单位轿车出售怎么处理
  • 推进社会治理的路径
  • 融资租赁做什么业务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设