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 相关文章推荐
PHP5中MVC结构学习
Oct 09 PHP
PHP4中session登录页面的应用
Jul 25 PHP
php 异常处理实现代码
Mar 10 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php ajax 静态分页过程形式
Sep 02 PHP
php中常用的预定义变量小结
May 09 PHP
PHP答题类应用接口实例
Feb 09 PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 PHP
PHP 搜索查询功能实现
Nov 29 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
php中的异常和错误浅析
May 03 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php rsa加密解密使用详解
2015/01/14 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
JavaScript异步加载问题总结
2018/02/17 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python中is和==的区别详解
2018/11/15 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Python autoescape标签用法解析
2020/01/17 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
品管员岗位职责
2013/11/10 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
《老王》教学反思
2014/02/23 职场文书
2014年宣传工作总结
2014/11/18 职场文书
离婚案件被告代理词
2015/05/23 职场文书
2015初一年级组工作总结
2015/07/24 职场文书