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新手上路(十)
Oct 09 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
php调用mysql数据 dbclass类
May 07 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
PHP-FPM之Chroot执行环境详解
Aug 03 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
php中如何执行linux命令详解
Nov 06 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
基于PHP实现邮箱验证激活过程详解
Oct 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
PHP中的CMS的涵义
2007/03/11 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
python中urllib模块用法实例详解
2014/11/19 Python
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python使用gensim计算文档相似性
2016/04/10 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
毕业生自荐书模版
2014/01/04 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
教你用python控制安卓手机
2021/05/13 Python