php依赖注入知识点详解

引言

你知道什么是依赖注入吗?依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的php框架的话,对于DI一定不陌生,因

为它们多多少少都用到了依赖注入来处理类与类之间的依赖关系。

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

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

第一种方案,也是最不可取的方案,就是在A类中直接用new关键词来创建一个B类,如下365bet体育在线官网_365体育投注平台_365在线体育消息所示:


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

第二种方案就是在A类的方法中传入需要的B类

如下365bet体育在线官网_365体育投注平台_365在线体育消息所示:


这种方法比第一种方案有了改进,A类不必与B类捆绑在一起,只要传入的类满足A类的需求,也可以是C类,也可以是D类等等。但是这

种方案的弊端在于如果A类依赖的类较多,参数列表会很长,容易发生混乱。

第三种方案是使用set方法传入

如下365bet体育在线官网_365体育投注平台_365在线体育消息所示:

b = $b;

 }

}

这种方案同样存在和第二种方案一样的弊端,当依赖的类增多时,我们需要些很多很多的set方法。这时我们在想如果有一个专门的类

(或者说一个容器)可以帮我们管理这些依赖关系就好了。

一个简单的依赖注入的例子

如下365bet体育在线官网_365体育投注平台_365在线体育消息来自twittee:

s[$k]=$c; }

 function __get($k) { return $this->s[$k]($this); }

}

有了container类之后我们可以怎样管理A与B之间的依赖关系呢,用365bet体育在线官网_365体育投注平台_365在线体育消息说话吧:

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();

});

这里举的只是一个很简单的例子,在实际中,容器类要考虑的有很多,比如延迟加载等等。

以上内容仅供参考!感谢大家的学习和对我们的支持。

时间: 2019-09-22

PHP进阶学习之依赖注入与Ioc容器详解

本文实例讲述了PHP依赖注入与Ioc容器.分享给大家供大家参考,具体如下: 背景 在很多编程语言(例如java)开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,一旦有修改,牵扯的类会很多. 最早在java的spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.目前许多主流PHP框架也使用了依赖注入容器,如ThinkPHP.L

php反射学习之依赖注入示例

本文实例讲述了php反射学习之依赖注入.分享给大家供大家参考,具体如下: 先看365bet体育在线官网_365体育投注平台_365在线体育消息:

php中的依赖注入实例详解

本文实例讲述了php中的依赖注入.分享给大家供大家参考,具体如下: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式. 我到现在依然不大明白上面"依赖注入"的定义是什么-- 有兴趣可以参考下上面对"依赖注入"的 解释. http://laravel-china.github.io/php-the-right-way/#dependency_injection 简而言之就是可以让我们在类的方法中更加

PHP经典设计模式之依赖注入定义与用法详解

本文实例讲述了PHP经典设计模式之依赖注入定义与用法.分享给大家供大家参考,具体如下: 依赖注入的实质就是把一个类不可能更换的部分和可更换的部分分离开来,通过注入的方式来使用,从而达到解耦的目的. 一个数据库连接类: class Mysql{ private $host; private $prot; private $username; private $password; private $db_name; // 构造方法 public function __construct(){ $th

Java经典设计模式之策略模式原理与用法详解

本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式一般由下面三部分组成: 1. 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 2. 具体策略角色:包装了相关的算法和行为. 3. 环境角色:持有某一个策略类的引用,客户端调用. 策略模式设计原则: 1. 把程序中需要变化的部分抽离出来,独立于不变

JAVA设计模式之建造者模式原理与用法详解

本文实例讲述了JAVA设计模式之建造者模式定义与用法.分享给大家供大家参考,具体如下: 建造者模式:将复杂对象的构造与它的实现相分离,让相同的构建过程可以创建不同的对象. 适用场合: 复杂对象的算法应该独立于该对象的组成部分或当构造过程允许被构造不同的对象时. 组成角色: 1 创建者(Builder)接口:为创建一个对象的对应部件所指定抽象接口. 2 具体创建者(ConcreteBuilder):实现Builder的接口以构造对象的各个部件. 3 具体创建者管理对象(Director):使用Bu

Android开发中方向传感器定义与用法详解【附指南针实现方法】

本文实例讲述了Android开发中方向传感器定义与用法.分享给大家供大家参考,具体如下: Android中的方向传感器在生活中是一个很好的应用,典型的例子是指南针的使用,我们先来简单介绍一下传感器中三个参数x,y,z的含义,以一幅图来说明. 补充说明:图中的坐标轴x,y,z和传感器中的X,Y,Z没有任何联系! 如上图所示,绿色部分表示一个手机,带有小圈那一头是手机头部 传感器中的X:如上图所示,规定X正半轴为北,手机头部指向OF方向,此时X的值为0,如果手机头部指向OG方向,此时X值为90,指向

Java经典设计模式之模板方法模式定义与用法示例

本文实例讲述了Java设计模式之模板方法模式.分享给大家供大家参考,具体如下: 我们在生活中,很多事情都包含特定的一些步骤.如去银行办理业务,通常步骤的次序是:取号 –> 填单 –> 等待叫号–>办理业务.这几个步骤中,有的是不变的,比如取号,每个人都要取,但有的是要变的,比如都有填单,但是根据不同的业务,填写的单据不同.又比如我们外出吃饭,一般的步骤是:点餐–>等待–>吃饭–>付钱,也能发现同样的规律.这样的事情数不胜数. 项目开发中,也可能遇到这样的情况,多个功能模

JAVA设计模式之组合模式原理与用法详解

本文实例讲述了JAVA设计模式之组合模式.分享给大家供大家参考,具体如下: 组合(整体与部分关系)模式:将不同但是相关的对象组合成树形结构以实现"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. * 模式角色组成: 1.Component对象: 是组合中的对象接口,是所有类共有的接口.是用于统一定义整体中的部分. 2.Leaf对象: 整体中的部分,没有下一级. 3.Composite对象: 用来存储子部件,在Component接口中实现与部分有关操作. 以公司构成

JAVA设计模式之访问者模式原理与用法详解

本文实例讲述了JAVA设计模式之访问者模式.分享给大家供大家参考,具体如下: 访问者模式: 一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作. 结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法. 适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由. 优点: 1.符合单一职责原则 2.扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展. 缺点: 1.如果要增加新元素,则会让操

JAVA设计模式之备忘录模式原理与用法详解

本文实例讲述了JAVA设计模式之备忘录模式.分享给大家供大家参考,具体如下: 备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态.在有需要的时候可将该对象恢复到原先保存的状态.我们相当于把对象原始状备份保留,所以叫备忘录模式. *模式 角色对象组成: 1.发起者对象:负责创建一个备忘录来记录当前对象的内部状态,并可使用备忘录恢复内部状态. 2.备忘录对象:负责存储发起者对象的内部状态,并防止其他对象访问备忘录. 3.管理者对象:负责备忘

javascript设计模式之对象工厂函数与构造函数详解

下面通过文字详解加365bet体育在线官网_365体育投注平台_365在线体育消息分析的方式给大家分享下javascript设计模式之对象工厂函数与构造函数的相关知识. 概述使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法.然而,除了这两种常用的对象创建方式,JavaScript还提供了其他方法创建对象.1).使用工厂函数创建对象我们可以编写一个函数,此函数的功能就是创建对象,可将其. 概述 使用对象字面量,或者向空对象中动态地添加新成员,是最简单易用的对象创建方法. 然而,除了这两种常用的对象创建方式,JavaScript还提

C语言在头文件中定义const变量详解

C语言在头文件中定义const变量详解 在头文件中定义const不会有多变量的警告或错误,如果该头文件被大量包含会造成rom空间的浪费. 通过查看*.i文件的展开呢,可以发现每个.i文件都会有相应的变量展开. 查看*.map文件,能查看到该变量的多个地址分配. 在预编译的时候如果在头文件定义了const变量,每一个包含该头文件的c文件都会将其展开,而在编译的时候不会报错,因为这符合语法规则,每一个包含这个头文件的*.c文件都会编译一次这个变量,分配一个新的地址,然后在链接的时候也不会报错,因为每

C/C++语言宏定义使用实例详解

?C/C++语言宏定义使用实例详解 1. #ifndef 防止头文件重定义 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成 一个可执行文件时,就会出现大量"重定义"的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定义. 方法:例如要编写头文件test.h 在头文件开头写上两行: #ifndef TEST_H #define TEST_H //一般是文件名的大写 头文件结尾写上一行: #endif 这样一个工程文件里同时