PHP依赖注入原理与用法分析


Posted in PHP onAugust 21, 2018

本文实例讲述了PHP依赖注入原理与用法。分享给大家供大家参考,具体如下:

引言

依然是来自到喜啦的一道面试题,你知道什么是依赖注入吗?

依赖注入(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 相关文章推荐
PHP define函数的使用说明
Aug 27 PHP
PHP 手机归属地查询 api
Feb 08 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
php导入导出excel实例
Oct 25 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
Sep 01 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 PHP
PHP 二维array转换json的实例讲解
Aug 21 #PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 #PHP
php 将json格式数据转换成数组的方法
Aug 21 #PHP
php正确输出json数据的实例讲解
Aug 21 #PHP
php将从数据库中获得的数据转换成json格式并输出的方法
Aug 21 #PHP
php实现将数据做成json的格式给前端使用
Aug 21 #PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 21 #PHP
You might like
example1.php
2006/10/09 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
zTree节点文字过多的处理方法
2017/11/24 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python实现自动发送邮件功能
2021/03/02 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Python字符串对象实现原理详解
2019/07/01 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python是怎样处理json模块的
2020/07/16 Python
名词解释型面试题(主要是网络)
2013/12/27 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
产假请假条
2014/04/10 职场文书
创建青年文明号材料
2014/05/09 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers