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 数组遍历的差异(array_diff 的实现)
Mar 23 PHP
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
php随机输出名人名言的代码
Oct 07 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
Nov 22 PHP
php目录拷贝实现方法
Jul 10 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
javascript函数中的arguments参数
2010/08/01 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
什么是数组名
2012/05/10 面试题
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
借名购房协议书范本
2014/10/06 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
廉政承诺书
2015/01/19 职场文书