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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
php中获得视频时间总长度的另一种方法
Sep 15 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
Dec 08 PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 PHP
PHP PDOStatement::bindColumn讲解
Jan 30 PHP
php封装的page分页类完整实例代码
Feb 01 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
星际争霸中的热键
2020/03/04 星际争霸
星际争霸任务指南——虫族
2020/03/04 星际争霸
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
js常用排序实现代码
2010/12/28 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
使用cx_freeze把python打包exe示例
2014/01/24 Python
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
python程序输出无内容的解决方式
2020/04/09 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
公司庆典活动邀请函
2014/01/09 职场文书
服务承诺书范文
2014/05/19 职场文书
初中成绩单评语
2014/12/29 职场文书
表扬通报怎么写
2015/01/16 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang