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连接MySQL代码的参数说明
Jun 07 PHP
php 无限级 SelectTree 类
May 19 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
php实现邮件发送并带有附件
Jan 24 PHP
php中memcache 基本操作实例
May 17 PHP
Yii框架上传图片用法总结
Mar 28 PHP
PHP学习笔记之php文件操作
Jun 03 PHP
PHP微信PC二维码登陆的实现思路
Jul 13 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
python 求定积分和不定积分示例
2019/11/20 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
德国帽子专家:Hutshopping
2019/11/03 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
英文商务邀请信
2014/01/22 职场文书
会议邀请书范文
2014/02/02 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
计算机专业自荐信
2014/05/24 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
Python爬取某拍短视频
2021/06/11 Python
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫