依赖注入

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

这篇文章主要介绍了PHP依赖注入原理与用法,简单讲述了依赖注入的概念、原理并结合实例形式分析了php实现与使用依赖注入的相关操作技巧,需要的朋友可以参考下
java

本文实例讲述了PHP依赖注入原理与用法。分享给大家供大家参考,具体如下:

引言

依然是来自到喜啦的一道面试题,你知道什么是依赖注入吗?

依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的php框架的话,对于DI一定不陌生,因为它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。

php中传递依赖关系的三种方案

其实要理解DI,首先要明白在php中如何传递依赖关系。

第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来创建一个B类,如下代码所示:

1
2
3
4
5
6
7
8
<?php
class A
{
  public function __construct()
  {
    $b = new B();
  }
}

为什么这种方案不可取呢?因为这样的话,A与B就耦合在了一起,也就是说A类无法脱离B类工作。

第二种方案就是在A类的方法中传入需要的B类,如下代码所示:

1
2
3
4
5
6
7
<?php

依赖注入的三种方式_PHP的依赖注入(DI)

PHP当中的依赖注入和控制反转是面试中经常问到的问题。同时,很多框架中也使用到了这种设计模式,可能有很多小伙伴们对这两个概念认识比较模糊,下面我就来给大家讲讲什么是依赖注入。

633cec74f8fe3a4d93f76f1bf4ba644f.png

依赖注入

概念:是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。

说明:要想理解DI(依赖注入),首先要明白在PHP中是如何传递依赖关系的。

PHP中传递依赖关系的三种方式:

①在A类中直接new一个B类,代码如下:

<?php //声明一个类B    class B{        //声明一个测试方法        public function test(){            //返回一个测试话术            return '这是一个测试方法';        }    }    //声明一个类A(假设A类想实现某个功能,要依赖B类来实现)    class A{        //声明一个测试方法        public function toTest(){            //声明一个B类的对象            $bObj = new B();            //调用B类的方法            var_dump($bObj->test());        }    }    //创建一个A类的对象    $obj = 

模仿laravel,使用反射来实现自动依赖注入

在看laravel源码的时候,在Container.php中有个build的方法,主要就是用了反射来进行实例化
参照它的写法,自己写了一个小例子
这里写的比较简单,就是一个依赖参数,正常应该普通参数也要放进去
类似在person类里的weight,address
public function __construct(Bag bag,weight, $address){}

 

<?php
/*
 * 目的:通过反射,自动找依赖注入的类。
 * 在实例的时候,里面的$bag, $book自动去查找,并且实例化
 * */

class Book{
    public function name(){
        return '语文书';
    }
}

class Bag{
    public $book;
        

依赖注入(Dependency Injection)模式

2.1 依赖注入模式

依赖注入(Dependency Injection) 是一个非常简单的概念,伸手-等待。(让DIP、IoC滚蛋)

如例程2.1所示,Client依赖于抽象类型(甚至是具体类) IServer,蛋是(1)Client的类体中不创建IServer(子类)的对象,它不想自己创建IServer对象,而是提供public的构造器Client(IServer)或设置方法setIServer (IServer)等(伸手),(2)坐等外界将初始化后的IServer对象(的引用)传递进来(等待)。…