https://www.jb51.net/article/146025.htm

本文实例讲述了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方法传入,如下代码所示:

这种方法比第一种方案有了改进,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();
});

  

最新文章

  1. toroiseSVN 无法连接服务器,提示unable connect to ……url 参数错误
  2. Oracle 创建dblink
  3. C语言补码作用
  4. 20145235 《Java程序设计》第5周学习总结
  5. 分享我设计的iOS项目目录结构
  6. nutch 大量网站
  7. Windows8.1 preview硬盘安装(图解)
  8. cf D. Alternating Current
  9. JSP 中 JSTL 页面标签的笔记
  10. Cppcheck 1.54 C/C++静态代码分析工具
  11. linux 文件系统解析及相关命令(转)
  12. 网站开发进阶(四)Tomcat Server处理一个http请求的过程
  13. LiveCharts文档-4基本绘图-1基本线条图
  14. URAL 1517 Freedom of Choice (后缀数组 输出两个串最长公共子串)
  15. nginx connect() failed,Connection refused,while connecting to upstream fastcgi
  16. cocos2d-x:将iOS项目编译成Andriod项目
  17. API - 使用Default对象 - 基础篇
  18. 使用UE4.16开发Oculus需要Oculus软件版本高于1.11
  19. java中使用opencv
  20. keil5中文乱码的解决

热门文章

  1. SpringBoot是如何动起来的
  2. Zookeeper注册中心和Dubbo-Admin管理平台的搭建
  3. javascript入门篇(二)
  4. MySQL 索引及查询优化总结
  5. 流式大数据计算实践(3)----高可用的Hadoop集群
  6. 痞子衡嵌入式:ARM Cortex-M内核那些事(5)- 指令集
  7. Linux基础命令第三天
  8. CentOS 7上安装Docker 1.8
  9. aps.net core mvc中使用session
  10. DOM编程以及domReady加载的几种方式