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版(2)
Oct 09 PHP
PHP脚本的10个技巧(3)
Oct 09 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
PHP生成指定随机字符串的简单实现方法
Apr 01 PHP
Yii使用技巧大汇总
Dec 29 PHP
PHP中each与list用法分析
Jan 08 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
Nov 05 PHP
PHP AjaxForm提交图片上传并显示图片源码
Nov 29 PHP
php curl操作API接口类完整示例
May 21 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 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基础学习笔记
2007/03/18 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
php实现删除空目录的方法
2015/03/16 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
python提取内容关键词的方法
2015/03/16 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
keras的三种模型实现与区别说明
2020/07/03 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
幼儿园中班教学反思
2014/02/10 职场文书
社区志愿者培训方案
2014/06/10 职场文书
优秀员工推荐材料
2014/12/20 职场文书
家属联谊会致辞
2015/07/31 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
python cv2图像质量压缩的算法示例
2021/06/04 Python
sql字段解析器的实现示例
2021/06/23 SQL Server