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+xslt在windows平台上
Oct 09 PHP
php 三维饼图的实现代码
Sep 28 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
php preg_filter执行一个正则表达式搜索和替换
Feb 27 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
php实现图片缩放功能类
Dec 18 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
php实现源代码加密的方法
Jul 11 PHP
谈谈PHP连接Access数据库的注意事项
Aug 12 PHP
php session_decode函数用法讲解
May 26 PHP
thinkphp 框架数据库切换实现方法分析
May 18 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 页面执行时间计算代码
2008/12/04 PHP
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
自己的js工具_Form 封装
2009/08/21 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
nodejs实现简单的gulp打包
2017/12/21 NodeJs
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python内置函数之filter map reduce介绍
2014/11/30 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
如何用Python破解wifi密码过程详解
2019/07/12 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
python内打印变量之%和f的实例
2020/02/19 Python
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
委托书英文
2015/01/28 职场文书
争先创优个人总结
2015/03/04 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
详解pytorch创建tensor函数
2022/03/22 Python
Oracle中日期的使用方法实例
2022/07/07 Oracle