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 相关文章推荐
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
Feb 27 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
php中实现获取随机数组列表的自定义函数
Apr 02 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
php 数组随机取值的简单实例
May 23 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP获取学生成绩的方法
Nov 17 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
如何给phpadmin一个保护
2006/10/09 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
做网页的一些技巧
2007/02/01 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
python开发之文件操作用法实例
2015/11/13 Python
python爬取个性签名的方法
2018/06/17 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
如何在django中运行scrapy框架
2020/04/22 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
采购主管的岗位职责
2013/12/17 职场文书
自我鉴定写作要点
2014/01/17 职场文书
会计专业导师推荐信
2014/03/08 职场文书
教师业务培训方案
2014/05/01 职场文书
新法人代表任命书
2014/06/06 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
vue+echarts实现多条折线图
2022/03/21 Vue.js