PHP依赖注入原理与用法分析

作者:dongxie548 时间:2023-09-04 01:22:54 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/u011250882/article/details/49850583

标签:PHP,依赖注入
0
投稿

猜你喜欢

  • 如何查询日期类型的数据?

    2009-11-11 20:04:00
  • Python程序设计入门(4)模块和包

    2023-06-18 11:37:36
  • 微信小程序picker组件简单用法示例

    2023-07-23 10:49:32
  • 利用python如何在前程无忧高效投递简历

    2022-10-26 22:33:02
  • JavaScript 全半角转换

    2010-02-04 17:14:00
  • django 通过url实现简单的权限控制的例子

    2022-02-05 07:07:50
  • PyCharm设置中文(汉化与解除汉化)的方法

    2021-02-04 19:11:30
  • js DOM模型操作

    2024-05-13 09:37:18
  • beam search及pytorch的实现方式

    2023-08-02 10:29:30
  • SQL使用ROW_NUMBER() OVER函数生成序列号

    2024-01-18 18:14:35
  • SQL Server 2000日志转移实现高可用性

    2009-01-20 15:04:00
  • 如何从Python字符串中删除最后一个分号或者逗号

    2023-12-22 07:29:53
  • 一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)

    2012-08-21 10:37:37
  • pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)

    2023-05-15 02:03:20
  • Python音乐爬虫完美绕过反爬

    2022-12-30 06:53:45
  • django多个APP的urls设置方法(views重复问题解决)

    2022-01-21 19:47:15
  • Win10下Python环境搭建与配置教程

    2023-08-24 03:25:18
  • uniapp实现人脸识别功能详细示例

    2024-04-16 08:59:57
  • 教你制作IBM LOGO的方法

    2007-10-23 13:34:00
  • python如何将mat文件转为png

    2023-04-14 07:37:21
  • asp之家 网络编程 m.aspxhome.com