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

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

引言

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

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

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

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

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

class A

{

public function __construct()

{

$b = new B();

}

}

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

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

class A

{

public function __construct(B $b)

{

}

}

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

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

第三种方案是使用set方法传入,如下代码所示:

class A

{

public function setB(B $b)

{

$this->b = $b;

}

}

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

这时我们在想如果有一个专门的类(或者说一个容器)可以帮我们管理这些依赖关系就好了。

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

如下代码来自twittee:

class Container {

private $s=array();

function __set($k, $c) { $this->s[$k]=$c; }

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

}

有了container类之后我们可以怎样管理A与B之间的依赖关系呢,用代码说话吧:

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程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery1.7.2正式发布了

下载地址 jQuery1.7.2正式发布了,下载地址: http://code.jquery.com/jquery-1.7.2.min.js (minified, production)http://code.jquery.com/jquery-1.7.2.js (unminified, debug)注:如果你正在使用jQuery Mobile,请使用最新的jQuer…

Linux Kbuild文档 2

2. Kconfig linux在2.6版本以后将配置文件由原来的config.in改为Kconfig,对于Kconfig的语法在内核源代码/Documentation/kbuild/kconfig-language.txt中做了详细的说明。 2.1 Kconfig的树状关系 Kconfig的配置选项是以树的形式组织的,如下所示所示&am…

php upw5.5,UPW

PHP EngineerResponsibilities:●Analysis and module design of software system;●Development and design of new products, and be able to write the core module code independently;●Responsible for the maintenance and upgrading of existing…

cocos2d对动画的各种操作

关于动画的各种操作,总结一下以便以后复习查找。 内容简要: 1、瞬时动作2、延时动作 3、 组合动作 4、动画 5、速度变化6、函数调用7、创建动作动画8、控制动画帧的速度 原文地址: http://blog.csdn.net/dingkun520wy/article/details/7014233 --…

matlab的灰色关联,五种灰色关联度分析matlab代码

《五种灰色关联度分析matlab代码》由会员分享,可在线阅读,更多相关《五种灰色关联度分析matlab代码(3页珍藏版)》请在人人文库网上搜索。1、灰色邓关联分析% p12-the study on the grey relational degree and its applicationFunction R1gld_deng(x)ssi…

Linux Kbuild文档 3

3. Kbuild Makefile Linux内核源代码是通过Makefile组织编译的,Linux2.6内核Makefile的许多特性和2.4内核差别很大,在内核目录的documention/kbuild/makefiles.txt中有详细的说明。 3.1 Makefile的组织结构 Linux内核的Makefile分为5个部分&#xff0…

SQL求解两个时间差

sql 求解两个时间差SELECTDATEDIFF( Second, 2009-8-25 12:15:12, 2009-9-1 7:18:20) --返回相差秒数SELECTDATEDIFF( Minute, 2009-9-1 6:15:12, 2009-9-1 7:18:20) --返回相差分钟数 SELECTDATEDIFF( Day, 2009-8-25 12:15:12,2009-9-1 7:18:20)--返回相差的天数SELEC…

matlab如何画一个平面,matlab 画平面

.framework使用注意、静态库配置及构架合成使用注意: 1.项目中使用的framework中包含了资源文件时,需要手动添加该framework中的资源文件 2.由于动态库(framework默认生成为动态库)不能上架,我们在生成的时候需要修改为 ...spring加载hibernate映射文件的几种方式 &…

Linux Kbuild文档 4

4. 一个使用linux kbuild实现可配置编译的例子 我编写了一个使用Linux kbuild机制实现可配置编译的小例子,工程名为print-example。包括如下如下几个目录: 其中scripts、Makefile、Makefile.flags是从busybox-1.9.0复制过来的。 4.1 运行print 运行m…

php标准输出重定向,python标准输出重定向方式

一. 背景在Python中,文件对象sys.stdin、sys.stdout和sys.stderr分别对应解释器的标准输入、标准输出和标准出错流。在程序启动时,这些对象的初值由sys.__stdin__、sys.__stdout__和sys.__stderr__保存,以便用于收尾(finalization)时恢复标准…

C# 温故而知新:Stream篇(六)

C# 温故而知新:Stream篇(六) BufferedStream 目录: 简单介绍一下BufferedStream如何理解缓冲区?BufferedStream的优势从BufferedStream 中学习装饰模式    如何理解装饰模式    再次理解下装饰模式在Stream中的…

Linux内核的Makefile和kconfig解读

一、概述 在内核编译中如何将各个目录树中的文件组织起来编译是一个很重要的问题,并且要根据用户配置来编译特有的内核。为了解决这个问题,内核使用两种文件,Makefie和Kconfig。分布到各目录的Kconfig构成了一个分布式的内核配置数据库&#…

网页快照

C#生成网站网页快照&#xff0c;Html转成图片2012-04-09 22:29HtmlToImg.cs using System; using System.Drawing; using System.Threading; using System.Windows.Forms; /// <summary> /// 生成网页快照 /// </summary> publicclassHtmlToImg { Bitmap m_Bitmap;…

php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程

看点&#xff1a;1、file_get_contents超时控制。2、页面编码判断。3、键盘Enter键捕捉响应。4、键盘event兼容处理。//event event || window.event;5、XMLHttpRequest 和 jQuery 两种实现方案。6、页面及源码同时展示。XMLHttpRequest版本 get_web.php复制代码 代码如下:hea…

HDU 3306 Another kind of Fibonacci

题意&#xff1a;A(0) 1 , A(1) 1 , A(N) X * A(N - 1) Y * A(N - 2) (N > 2)&#xff1b;给定三个值N&#xff0c;X&#xff0c;Y求S(N):S(N) A(0)2 A(1)2……A(n)2。 思路&#xff1a;原来我们讲的斐波那契数列是&#xff1a; F(0) 1, F(1) 1, F(N) F(N - 1) F(N…

php中拼接html代码,如何利用ajax给html动态拼接代码

function get_all_category_with_id() {$.ajax( {type: "get", url: "../../../appUpload/getAllCategoryByid", async : false, dataType: "text", success: function (data) {var obj JSON.parse(data);var str "";//先将元素对应清…

Arm Linux交叉编译和连接过程分析(1)

一、配置内核&#xff08;Kconfig&#xff09; 我们配置内核是实质是根据众多目录下面的Kconfig文件中组合成我们需要的一个最佳选择&#xff0c;即最终在根目录下面生成的.config文件&#xff0c;而这个文件会在根目录Makefile下调用的。这一部分我们主要讨论整个SEP4020体系…

struts2标签_select获取action传过来的值

<s:select list"#session.userlist" //从Action传过来的键(属性)的名称headerKey"请选择" //默认选中项的值headerValue"请选择" //默认选中项显示的信息listKey"project_id" …

3500 yuan to php,350 CNY to PHP Currency Converter - 人民币 菲律宾比索 汇率兑换

Exchange350 CNY2612.29 PHPExchange 350 人民币2612.29 菲律宾比索Exchange1750 CNY13061.46 PHPExchange 1750 人民币13061.46 菲律宾比索Exchange3500 CNY26122.92 PHPExchange 3500 人民币26122.92 菲律宾比索Exchange17500 CNY130614.62 PHPExchange 17500 人民币130614.6…

Arm Linux交叉编译和连接过程分析(2)

二、编译内核镜像过程 1、编译过程中涉及到到文件&#xff1a; /Makefile 编译产生顶层vmlinux镜像文件/scripts/Kbuild.include make过程中到一些基本定义 /scripts/Makefile.lib 编译内核时用到到函数库文件 /scripts/Makefile.build 内核编译到相关命令文件…