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截取中文字符串的问题
Jul 12 PHP
无数据库的详细域名查询程序PHP版(4)
Oct 09 PHP
PHP中一个控制字符串输出的函数
Oct 09 PHP
FCKeditor添加自定义按钮
Mar 27 PHP
基于php 随机数的深入理解
Jun 05 PHP
基于PHP的简单采集数据入库程序【续篇】
Jul 30 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
PHP实现的简单日历类
Nov 29 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
php5.6.x到php7.0.x特性小结
Aug 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
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
Javascript typeof 用法
2008/12/28 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
解决python opencv无法显示图片的问题
2018/10/28 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Python3 assert断言实现原理解析
2020/03/02 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
护士个人简历自荐信
2013/10/18 职场文书
师范大学应届生求职信
2013/11/21 职场文书
银行实习的自我鉴定
2013/12/10 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
本科生就业推荐信
2014/05/19 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
公司车辆管理制度
2015/08/04 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
MySQL系列之二 多实例配置
2021/07/02 MySQL