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 相关文章推荐
DISCUZ 分页代码
Jan 02 PHP
PHP5 面向对象程序设计
Feb 13 PHP
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
PHP CURL中传递cookie的方法步骤
May 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Python基本数据类型详细介绍
2014/03/11 Python
Python Socket编程入门教程
2014/07/11 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
用python实现对比两张图片的不同
2018/02/05 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Php多进程实现代码
2018/05/07 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
python属于软件吗
2020/06/18 Python
如何利用python发送邮件
2020/09/26 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
C语言笔试题回忆
2015/04/02 面试题
五一服装活动方案
2014/01/11 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
校庆标语集锦
2014/06/25 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书