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+jquery编码方面的一些心得(utf-8 gb2312)
Oct 12 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP按一定比例压缩图片的方法
Oct 12 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中设置index.php文件为只读的方法
2013/02/06 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
python数据结构之图的实现方法
2015/07/08 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
python实现桌面托盘气泡提示
2019/07/29 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
旅游项目开发策划书
2014/01/18 职场文书
投标承诺书范本
2014/03/27 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
领导干部作风建设总结
2014/10/23 职场文书
研讨会致辞
2015/07/31 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫