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面向对象编程快速入门
Dec 14 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
PHP检测移动设备类mobile detection使用实例
Apr 14 PHP
php利用curl抓取新浪微博内容示例
Apr 27 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
Laravel5中contracts详解
Mar 02 PHP
php遍历删除整个目录及文件的方法
Mar 13 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
PHP中PDO事务处理操作示例
May 02 PHP
PHP实现一个轻量级容器的方法
Jan 28 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
Feb 26 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
超级简单的php+mysql留言本源码
2009/11/11 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
python处理文本文件并生成指定格式的文件
2014/07/31 Python
python字符串排序方法
2014/08/29 Python
Python内置函数之filter map reduce介绍
2014/11/30 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
建龙钢铁面试总结
2014/04/15 面试题
创业计划书中包含的9个方面
2013/12/26 职场文书
党员服务承诺书
2014/05/28 职场文书
《1942》观后感
2015/06/08 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python