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多线程实现方法及用法实例详解
Oct 26 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
PHP制作登录异常ip检测功能的实例代码
Nov 16 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
Lumen timezone 时区设置方法(慢了8个小时)
Jan 20 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 PHP
php实现的生成排列算法示例
Jul 25 PHP
PHP针对redis常用操作实例详解
Aug 17 PHP
PHP设计模式(观察者模式)
Jul 07 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 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
js获取form表单中name属性的值
2019/02/27 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
python 生成器协程运算实例
2017/09/04 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python绘制动态曲线教程
2020/02/24 Python
对python中return与yield的区别详解
2020/03/12 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
python实现计算图形面积
2021/02/22 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
党员创先争优活动总结
2014/05/04 职场文书
经管应届生求职信范文
2014/05/18 职场文书
民事辩护词范文
2015/05/21 职场文书
正规借条模板
2015/05/26 职场文书
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL