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学习资料汇总与网址
Mar 16 PHP
php Session存储到Redis的方法
Nov 04 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
PHP链表操作简单示例
Oct 15 PHP
PHP 传输会话curl函数的实例详解
Sep 12 PHP
零基础php编程好学吗
Oct 11 PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
关于jQuery object and DOM element
2013/04/15 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
python检测服务器是否正常
2014/02/16 Python
Python实现二维数组输出为图片
2018/04/03 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
pytorch标签转onehot形式实例
2020/01/02 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
经理秘书找工作求职信
2013/12/19 职场文书
房地产广告词大全
2014/03/19 职场文书
自我工作评价范文
2015/03/06 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
法制主题班会教案
2015/08/13 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
python实现监听键盘
2021/04/26 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python
MySQL创建管理HASH分区
2022/04/13 MySQL
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android