php依赖注入知识点详解


Posted in PHP onSeptember 23, 2019

引言

你知道什么是依赖注入吗?依赖注入(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的FTP学习(二)[转自奥索]
Oct 09 PHP
ajax php 实现写入数据库
Sep 02 PHP
PHP里的中文变量说明
Jul 23 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
php身份证号码检查类实例
Jun 18 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
php引用和拷贝的区别知识点总结
Sep 23 #PHP
php异常处理捕获错误整理
Sep 23 #PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 #PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 #PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 #PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 #PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 #PHP
You might like
生成缩略图
2006/10/09 PHP
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
对python中的iter()函数与next()函数详解
2018/10/18 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
前台文员我鉴定
2014/01/12 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
党员批评与自我批评
2014/02/12 职场文书
学生会招新策划书
2014/02/14 职场文书
保健品市场营销方案
2014/03/31 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
2015年个人思想总结
2015/03/09 职场文书
总经理岗位职责范本
2015/04/01 职场文书
长征观后感
2015/06/09 职场文书
金榜题名主持词
2015/07/02 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL