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 相关文章推荐
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
php5 图片验证码实现代码
Dec 11 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
Laravel 5框架学习之表单
Apr 08 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
PHP 中常量的知识整理
Apr 14 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
PHP levenshtein()函数用法讲解
Mar 08 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制作中间带自己定义图片二维码的方法
2014/01/27 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
Python 可爱的大小写
2008/09/06 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
Python中偏函数用法示例
2018/06/07 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
群众路线教育实践活动调研报告
2014/11/03 职场文书
2015年科协工作总结
2015/05/19 职场文书
离婚案件上诉状
2015/05/23 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL
python图像处理 PIL Image操作实例
2022/04/09 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android