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 相关文章推荐
mysql 中InnoDB和MyISAM的区别分析小结
Apr 15 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
php中get_meta_tags()、CURL与user-agent用法分析
Dec 16 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
PHP类相关知识点实例总结
Sep 28 PHP
php实现图片以base64显示的方法
Oct 13 PHP
php常用数组函数实例小结
Dec 29 PHP
php 函数使用可变数量的参数方法
May 02 PHP
laravel 模型查询按照whereIn排序的示例
Oct 16 PHP
Yii框架布局文件的动态切换操作示例
Nov 11 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
中篇:安装及配置PHP
2006/12/13 PHP
php调用mysql存储过程
2007/02/14 PHP
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
Javascript this指针
2009/07/30 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
Vuex新手的理解与使用详解
2019/05/31 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
详解Python中的__init__和__new__
2014/03/12 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
Python微医挂号网医生数据抓取
2019/01/24 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
python判断链表是否有环的实例代码
2020/01/31 Python
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
JAVA代码查错题
2014/10/10 面试题
.NET面试问题集
2015/12/08 面试题
计算机专业职业规划
2014/02/28 职场文书
安全标语口号
2014/06/09 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
个人违纪检讨书
2014/09/15 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
唐山大地震的观后感
2015/06/05 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
python通过函数名调用函数的几种方法总结
2021/06/07 Python
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏