如何在PHP项目中进行依赖注入和控制反转

  介绍

本文章向大家介绍如何在PHP项目中进行依赖注入和控制反转,主要包括如何在PHP项目中进行依赖注入和控制反转的使用实例,应用技巧,基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

PHP有什么用

PHP是一个嵌套的缩写名称,指的是英文超级文本预处理语言(PHP:超文本预处理器)的缩写,它的语法混合了C、Java、Perl以及PHP自创新的语法,主要用来做网站开发,许多小型网站都用PHP开发,因为PHP是开源的,从而使PHP经得久不衰。

<强> 1,参与者都有谁吗?

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

<强> 2,依赖:谁依赖于谁?为什么会有依赖?

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

<强> 3注入:谁注入于谁?到底注入什么?

<强>答:强通过容器向对象注入其所需要的外部资源

<强> 4,控制反转:谁控制谁?控制什么?为什么叫反转?

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

<强> 5,依赖注入和控制反转是同一概念吗?

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

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

<强> 1。构造器注入

& lt; php ?   class  Book  {   private 才能;db_conn美元;   ,   public 才能;function  __construct (db_conn美元),{   ,,,这个→美元db_conn =, db_conn美元;   ,,}   }

<强> 2,setter注入

& lt; php ?      ,   class 书{   美元,才能private 数据库;   private  $文件;   ,,function  setdb ($ db) {   ,,,,这个→美元db=$ db;   ,,}   ,,function  setfile(文件){   ,,,,这个→美元=$文件;   ,,}   }   class 文件{}   class  db {}   …      测试{class    ,book 美元;=,new 书();   ,美元,书→setdb (new  db ()),,   ,,书→美元setfile (new 文件());   }   ?在

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

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

& lt; php ?   class  Ioc  {   protected 才能;db_conn美元;   public 才能static  function  make_book (), {   ,,,new_book 美元;=,new 书();   ,,,美元new_book→set_db (self:: $ db_conn);   ,,,//?   ,,,//?   ,,,//其他的依赖注入   ,,,return  new_book美元;   ,,}   }

此时,如果获取一个书实例,只需要执行newone=国际奥委会:美元:makebook ();

以上是容器的一个具体实例,最好还是不要把具体的某个依赖注入写成方法,采用注册表注册,得到获取比较好

& lt; php ?   class  Ioc  {/* *   *,@var 注册的依赖数组   */,   protected 才能;static  registry 美元;=,数组();   ,   ,/* *   *,才能添加一个解决到注册数组中   *,才能@param  string  name 美元;依赖标识   *,才能@param  object  resolve 美元;一个匿名函数用来创建实例   *,才能@return 空白   ,*/public 才能;static  function 注册(名称、美元,Closure 解决美元)   {才能   ,,静态:注册表[名字]美元美元,=,解决美元;   ,,}   ,   ,/* *   ,,*,返回一个实例   ,,*,@param  string  name 美元;依赖的标识   ,,*,@return 混合   ,,*/public 才能;static  function 解决(名称)   {才能   ,,,if (,静态:注册(名字),)   ,,,{   ,,,,name 美元;=,静态:注册表[名字]美元美元;   ,,,,return  $ name ();   ,,,}   ,,,throw  new 例外(& # 39;Nothing  registered  with  that 名字,,傻瓜# 39;公司);   ,,}   ,/* *   *,才能查询某个依赖实例是否存在   *,才能@param  string  name 美元;id   *,才能@return  bool    ,*/public 才能;static  function 注册(名称)   {才能   ,,return  array_key_exists(美元美元的名字,静态::注册表);   ,,}   }

如何在PHP项目中进行依赖注入和控制反转