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 相关文章推荐
mysq GBKl乱码
Nov 28 PHP
PHP与MySQL开发中页面乱码的产生与解决
Mar 27 PHP
php json_encode奇怪问题说明
Sep 27 PHP
url decode problem 解决方法
Dec 26 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
php二维数组排序详解
Nov 06 PHP
php获取301跳转URL简单实例
Dec 16 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
PHP实现返回JSON和XML的类分享
Jan 28 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 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
php数据库连接
2006/10/09 PHP
php 字符转义 注意事项
2009/05/27 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
python 2.6.6升级到python 2.7.x版本的方法
2016/10/09 Python
Python算法之图的遍历
2017/11/16 Python
基于python实现名片管理系统
2018/11/30 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
详解python 内存优化
2020/08/17 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
百丽国际旗下购物网站:优购
2017/02/28 全球购物
文明寝室标语
2014/06/13 职场文书
转让协议书范本
2014/09/13 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
作文评语集锦
2014/12/25 职场文书
病假证明模板
2015/06/19 职场文书
通知怎么写?
2019/04/17 职场文书
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android