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字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
Oct 10 PHP
合格的PHP程序员必备技能
Nov 13 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
微信支付开发交易通知实例
Jul 12 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
PHP实现计算器小功能
Aug 28 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
微信小程序入门教程
2016/11/18 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python中设置变量访问权限的方法
2015/04/27 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Python实现的快速排序算法详解
2017/08/01 Python
django 多数据库配置教程
2018/05/30 Python
python使用thrift教程的方法示例
2019/03/21 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
初中政治教学反思
2014/01/17 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
三年级学生评语
2014/04/23 职场文书
小学生演讲稿大全
2014/04/25 职场文书
爱的教育读书笔记
2015/06/26 职场文书
音乐研修感悟
2015/11/18 职场文书
HAM-2000摩机图
2021/04/22 无线电