php依赖注入知识点详解


Posted in PHP onSeptember 23, 2019

引言

你知道什么是依赖注入吗?依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的php框架的话,对于DI一定不陌生,因

为它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。

php中传递依赖关系的三种方案

其实要理解DI,首先要明白在php中如何传递依赖关系。

第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来创建一个B类,如下代码所示:

<?php

class A

{

 public function __construct()

 {

  $b = new B();

 }

}

为什么这种方案不可取呢?因为这样的话,A与B就耦合在了一起,也就是说A类无法脱离B类工作。

第二种方案就是在A类的方法中传入需要的B类

如下代码所示:

<?php

class A

{

 public function __construct(B $b)

 {

 }

}

这种方法比第一种方案有了改进,A类不必与B类捆绑在一起,只要传入的类满足A类的需求,也可以是C类,也可以是D类等等。但是这

种方案的弊端在于如果A类依赖的类较多,参数列表会很长,容易发生混乱。

第三种方案是使用set方法传入

如下代码所示:

<?php

class A

{

 public function setB(B $b)

 {

  $this->b = $b;

 }

}

这种方案同样存在和第二种方案一样的弊端,当依赖的类增多时,我们需要些很多很多的set方法。这时我们在想如果有一个专门的类

(或者说一个容器)可以帮我们管理这些依赖关系就好了。

一个简单的依赖注入的例子

如下代码来自twittee:

<?php

class Container {

 private $s=array();

 function __set($k, $c) { $this->s[$k]=$c; }

 function __get($k) { return $this->s[$k]($this); }

}

有了container类之后我们可以怎样管理A与B之间的依赖关系呢,用代码说话吧:

<?php

class A

{

 private $container;

 public function __construct(Container $container)

 {

  $this->container = $container;

 }

 public function doSomeThing()

 {

  //do something which needs class B

  $b = $this->container->getB();

  //to do

 }

}

再将B类注入到容器类中:

$c = new Container();

$c->setB(new B());

还可以传入一个匿名函数,这样B类就不会在传入时就立即实例化,而是在真正调用时才完成实例化的工作

$c = new Container();

$c->setB(function (){

 return new B();

});

这里举的只是一个很简单的例子,在实际中,容器类要考虑的有很多,比如延迟加载等等。

以上内容仅供参考!感谢大家的学习和对三水点靠木的支持。

PHP 相关文章推荐
php访问查询mysql数据的三种方法
Oct 09 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
php数组的一些常见操作汇总
Jul 17 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
php基础教程
Aug 26 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
php实现图片以base64显示的方法
Oct 13 PHP
php中__toString()方法用法示例
Dec 07 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP微信支付结果通知与回调策略分析
Jan 10 PHP
PHP扩展类型及安装方式解析
Apr 27 PHP
PHP isset empty函数相关面试题及解析
Dec 11 PHP
php引用和拷贝的区别知识点总结
Sep 23 #PHP
php异常处理捕获错误整理
Sep 23 #PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 #PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 #PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 #PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 #PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 #PHP
You might like
PHP的几个常用数字判断函数代码
2012/04/24 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
讲解Python中的递归函数
2015/04/27 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Flask框架配置与调试操作示例
2018/07/23 Python
django框架自定义用户表操作示例
2018/08/07 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
python实现车牌识别的示例代码
2019/08/05 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
学习雷锋精神心得体会范文
2014/03/12 职场文书
联谊活动总结范文
2015/05/09 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers