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 相关文章推荐
Email+URL的判断和自动转换函数
Oct 09 PHP
php循环输出数据库内容的代码
May 24 PHP
php Xdebug 调试扩展的安装与使用.
Mar 13 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
php图片添加文字水印实现代码
Mar 15 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
Sep 30 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP PDOStatement::fetch讲解
Jan 31 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 输出URL的快捷方式示例代码
2013/09/22 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
python的flask框架难学吗
2020/07/31 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
怎么写自荐书范文
2014/02/12 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Vue全局事件总线你了解吗
2022/02/24 Vue.js