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内核介绍及扩展开发指南―基础知识
Sep 11 PHP
php学习之function的用法
Jul 14 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
PHP根据IP地址获取所在城市具体实现
Nov 27 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
PHP微信API接口类
Aug 22 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
laravel 获取当前url的别名方法
Oct 11 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数组是否为索引数组的实现方法
2013/06/13 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
python切割图片的示例
2020/11/12 Python
python实现发送邮件
2021/03/02 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
高校毕业生登记表自我鉴定
2013/11/03 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书