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 相关文章推荐
改进的IP计数器
Oct 09 PHP
完美实现GIF动画缩略图的php代码
Jan 02 PHP
Yii框架中memcache用法实例
Dec 03 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
ThinkPHP中数据操作案例分析
Sep 27 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
深入理解PHP之源码目录结构与功能说明
Jun 01 PHP
laravel学习教程之关联模型
Jul 30 PHP
使用PHP开发留言板功能
Nov 19 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
Python中if有多个条件处理方法
2020/02/26 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
HEMA英国:荷兰原创设计
2018/08/28 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
物流合作计划书
2014/01/10 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
房屋继承公证书
2014/04/10 职场文书
暑期学习心得体会
2014/09/02 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
爱国主义主题班会
2015/08/14 职场文书