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生成HTML静态页面实例代码
Aug 31 PHP
php与paypal整合方法
Nov 28 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
php中删除、清空session的方式总结
Oct 09 PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 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生成带有雪花背景的验证码
2006/10/09 PHP
php中如何执行linux命令详解
2018/11/06 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
python实现红包裂变算法
2016/02/16 Python
python生成密码字典的方法
2018/07/06 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
python批量创建指定名称的文件夹
2019/03/21 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
消防先进事迹材料
2014/02/10 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
学生上课说话检讨书
2014/10/25 职场文书
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript