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 相关文章推荐
简单易用的计数器(数据库)
Oct 09 PHP
PHP Squid中可缓存的动态网页设计
Sep 17 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
May 27 PHP
深入解析php中的foreach函数
Aug 31 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
windows系统php环境安装swoole具体步骤
Mar 04 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
GD输出汉字的函数的分析
2006/10/09 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
对python中dict和json的区别详解
2018/12/18 Python
python获取整个网页源码的方法
2020/08/03 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
致垒球运动员加油稿
2014/02/16 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
课外科技活动总结
2014/08/27 职场文书
公司授权委托书
2014/10/17 职场文书
2014年减负工作总结
2014/12/10 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫