注入理解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

零途云:香港站群云服务器16IP220元/月,云服务器低至39元/月

零途云(Lingtuyun.com)新上了香港站群云服务器 – CN2精品线路,香港多ip站群云服务器16IP/5M带宽,4H4G仅220元/月,还有美国200g高防云服务器低至39元/月起。零途云是一家香港公司,主要产品香港cn2 gia线路、美国Cera线路云主机,美国CERA高防服务器,日本CN2直连服务器;同时提供香港多ip站群云服务器。即日起,购买香港/美国/日本云服务器享受9折优惠,新...

Megalayer(48元)新增 美国CN2优化线路特价服务器和VPS方案

Megalayer 商家算是新晋的服务商,商家才开始的时候主要是以香港、美国独立服务器。后来有新增菲律宾机房,包括有VPS云服务器、独立服务器、站群服务器等产品。线路上有CN2优化带宽、全向带宽和国际带宽,这里有看到商家的特价方案有增加至9个,之前是四个的。在这篇文章中,我来整理看看。第一、香港服务器系列这里香港服务器会根据带宽的不同区别。我这里将香港机房的都整理到一个系列里。核心内存硬盘IP带宽...

legionbox:美国、德国和瑞士独立服务器,E5/16GB/1Gbps月流量10TB起/$69/月起

legionbox怎么样?legionbox是一家来自于澳大利亚的主机销售商,成立时间在2014年,属于比较老牌商家。主要提供VPS和独立服务器产品,数据中心包括美国洛杉矶、瑞士、德国和俄罗斯。其中VPS采用KVM和Xen架构虚拟技术,硬盘分机械硬盘和固态硬盘,系统支持Windows。当前商家有几款大硬盘的独立服务器,可选美国、德国和瑞士机房,有兴趣的可以看一下,付款方式有PAYPAL、BTC等。...

依赖注入为你推荐
手游运营手册游戏策划新手应该看那些书籍?百度手写百度输入法切换手写 百度汉王手写输入法神雕侠侣礼包大全神雕侠侣手游版四重大礼包怎么得到啊?雅虎天盾我装了360安全卫士,原来的雅虎天盾需不需要卸载奇虎论坛360有论坛中心?ejb开发什么是EJB?它是干什么的?和JAVA,JSP有关系吗?他们各有什么特点和用途?2012年正月十五2012年正月十五上午9点27分出生的女孩儿五行缺什么,命怎么样什么是云平台什么是云平台管理软件,一个云平台软件应该具有哪些基本功能网站优化方案网站优化方案应该从哪些方面去分析?blogcn哪种博客更好...sina.baidu.blogcn还是.............?
北京服务器租用 深圳域名空间 linode 青果网 云全民 域名转向 有奖调查 seednet 卡巴斯基试用版 cloudlink ebay注册 石家庄服务器托管 广州服务器托管 汤博乐 免费的加速器 godaddy中文 e-mail linux服务器系统 alexa搜 nic 更多