注入理解php依赖注入和控制反转

依赖注入  时间:2021-02-08  阅读:()

★精品文档★

理解php依赖注入和控制反转

要想理解php依赖注入和控制反转两个概念就必须搞清楚如下的问题

DI——Dependency Injection 依赖注入

IoC——Inversion of Control 控制反转

1 、参与者都有谁

答一般有三方参与者一个是某个对象一个是IoC/DI的容器另一个是某个对象的外部资源。又要名词解释一下某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序对象的外部资源指的就是对象需要的但是是从对象外部获取的都统称资源比如对象需要的其它对象、或者是对象需要的文件资源等等。

2、依赖谁依赖于谁为什么会有依赖

答某个对象依赖于IoC/DI的容器。依赖是不可避免的在一个项目中各个类之间有各种各样的关系不可能全部完全独立这就形成了依赖。传统的开发是使用其他类时直接调用这会形成强耦合这是要避免的。依赖注入借用容器转移了被依赖对象实现解耦。

3、注入谁注入于谁到底注入什么

答通过容器向对象注入其所需要的外部资源

4、控制反转谁控制谁控制什么为什么叫反转

1/7

★精品文档★

答 IoC/DI的容器控制对象主要是控制对象实例的创建。反转是相对于正向而言的那么什么算是正向的呢考虑一下常规情况下的应用程序如果要在A里面使用C你会怎么做呢当然是直接去创建C的对象也就是说是在A类中主动去获取所需要的外部资源C这种情况被称为正向的。那么什么是反向呢就是A类不再主动去获取C而是被动等待等待IoC/DI的容器获取一个C的实例然后反向的注入到A类中。

5、依赖注入和控制反转是同一概念吗

答从上面可以看出依赖注入是从应用程序的角度在描述可以把依赖注入描述完整点应用程序依赖容器创建并注入它所需要的外部资源而控制反转是从容器的角度在描述描述完整点容器控制应用程序由容器反向的向应用程序注入应用程序所需要的外部资源。  

下面我们通过例子来具体看看依赖注入的一些实现方式

1 .构造器注入

<?phpclass Book{

 private$db_conn;

 publ ic function__construct($db_conn) {

  $this-db_conn=$db_conn;

2/7

★精品文档★

  }

}

2、 setter注入

<?phpclass book{

  private$db;private$fi le;

  function setdb($db){

   $this-db=$db;

  }

  function setfi le($fi le){

   $this-fi le=$fi le;

  }

}class fi le{}class db{}

. . .class test{

$book=new Book();

  $book-setdb(new db()); 

  $book-setfi le(new fi le());

}

3/7

★精品文档★

?

上面俩种方法代码很清晰但是当我们需要注入很多个依赖时意味着又要增加很多行会比较难以管理。

比较好的解决办法是建立一个class作为所有依赖关系的container 在这个class中可以存放、创建、获取、查找需要的依赖关系

<?phpclass Ioc{

 protected$db_conn;

 publ ic static function make_book() {

  $new_book=new Book();

  $new_book-set_db(self: :$db_conn);

   //. . .

   //. . .

   //其他的依赖注入

   return$new_book;

  }

}

此时如果获取一个book实例只需要执行$newone=Ioc: :makebook();

以上是container的一个具体实例最好还是不要把具体的某个依赖注入写成方法采用reg istry注册get获取比较

4/7

★精品文档★

<?phpclass Ioc{

**

*@var注册的依赖数组

*/

 protected static$registry=array();

  /**

  *添加一个resolve到registry数组中

  *@param string$name依赖标识

  *@param object$resolve一个匿名函数用来创建实例

  *@return void

  */

  publ ic static function register($name,Closure$resolve)

  {

  static: :$registry[$name]=$resolve;

  }

  /**

  *返回一个实例

  *@param string$name依赖的标识

5/7

★精品文档★

  *@return mixed

  */

 publ ic static function resolve($name)

  {

   if (static: :registered($name) )

   {

   $name=static: :$registry[$name];   return$name();

   }

    throw new Exception(‘Nothingregistered with that name, fool . ’);

  }

  /**

  *查询某个依赖实例是否存在

  *@param string$name id

  *@return bool 

  */

 publ ic static function registered($name)

  {

   return array_key_exists($name,static: :$registry);

  }

6/7

★精品文档★

}

现在就可以通过如下方式来注册和注入一个

<?php

$book=Ioc: :registry(‘book’ , function(){

$book=new Book;

$book-setdb(‘ . . . ’);

$book-setprice(‘ . . . ’);return$book;

});

//注入依赖

$book=Ioc: :resolve(‘book’);

?

以上就是针对php依赖注入和控制反转的理解希望对大家学习PHP程序设计有所帮助。

7/7

GreenCloudVPS$20/年多国机房可选,1核@Ryzen 3950x/1GB内存/30GB NVMe/10Gbps端口月流量2TB

GreencloudVPS此次在四个机房都上线10Gbps大带宽VPS,并且全部采用AMD处理器,其中美国芝加哥机房采用Ryzen 3950x处理器,新加坡、荷兰阿姆斯特丹、美国杰克逊维尔机房采用Ryzen 3960x处理器,全部都是RAID-1 NVMe硬盘、DDR4 2666Mhz内存,GreenCloudVPS本次促销的便宜VPS最低仅需20美元/年,支持支付宝、银联和paypal。Gree...

新加坡云服务器 1核2Gg 46元/月 香港云服务器 1核2G 74元/月 LightNode

LightNode是一家成立于2002年,总部位于香港的VPS服务商。提供基于KVM虚拟化技术.支持CentOS、Ubuntu或者Windows等操作系统。公司名:厦门靠谱云股份有限公司官方网站:https://www.lightnode.com拥有高质量香港CN2 GIA与东南亚节点(河内、曼谷、迪拜等)。最低月付7.71美金,按时付费,可随时取消。灵活满足开发建站、游戏应用、外贸电商等需求。首...

免费注册宝塔面板账户赠送价值3188礼包适合购买抵扣折扣

对于一般的用户来说,我们使用宝塔面板免费版本功能还是足够的,如果我们有需要付费插件和专业版的功能,且需要的插件比较多,实际上且长期使用的话,还是购买付费专业版或者企业版本划算一些。昨天也有在文章中分享年中促销活动。如今我们是否会发现,我们在安装宝塔面板后是必须强制我们登录账户的,否则一直有弹出登录界面,我们还是注册一个账户比较好。反正免费注册宝塔账户还有代金券赠送。 新注册宝塔账户送代金券我们注册...

依赖注入为你推荐
iphone360手机卫士iphone需要360安全卫士吗?外网和内网内网和外网是什么意思啊??安装程序配置服务器失败安装用友u8的数据库最后说:“安装程序配置服务器失败。参考服务器错误日志和 C:WINDOWSsqlstp.log 了解更多信息。”windows优化大师怎么用如何用Windows优化大师??人人时光机求徐智勇的时光机的歌词,百度上全是周杰轮跟五月天的,我要粤语啊安卓应用平台安卓系统支持的软件并不是那么多,为什么这么多人推崇?9flash怎么使用ePSXe啊?网店推广网站网店怎么推广?苹果5怎么越狱苹果5怎么越狱腾讯文章腾讯新闻的精选微信里面收藏的文章在哪里
台湾服务器租用 美国vps推荐 申请免费域名 5折 百度云100as 英文简历模板word 回程路由 创宇云 好看的桌面背景大图 500m空间 网站挂马检测工具 空间论坛 129邮箱 adroit phpmyadmin配置 稳定免费空间 paypal注册教程 申请免费空间和域名 免费mysql数据库 空间购买 更多