PHP依赖注入(DI)和控制反转(IOC)详细解决方案

PHP依赖注入(DI)和控制反转(IOC)详细解决方案
首先,依赖注入和反转控制是同一件事,是一种设计模式,这种设计模式是用来减少程序之间的耦合,我研究过它,看到TP的官方网站没有相关文章,我写了这篇文章介绍了设计模式,希望能贡献一些社区的力量。

首先,不要追求设计模式的定义,否则你会说云里雾里的,作者是受苦,百度n本文从理论的角度来描述大量生涩的词汇,或是在java代码描述,而且干。

在任何情况下,都会稍微清除一点,依赖注入的概念是在PHP透视图中描述的。

首先让我们假设这里有一个类,其中需要类中的数据库连接。以最原始的方式,我们可以编写这个类。

类的例子{

私人_db美元;
功能__construct(){
包含;
美元-> _db =新的DB(localhost
}
功能列表(){
这_db美元-> ->查询(...... );/ /这里特定SQL语句的略写
}
}
过程:
在构造函数中,首先输入数据库类文件

然后通过新DB实例化DB类,并传递给数据库连接信息。

之后,该列表的方法可以调用数据库类通过美元-> _db实现数据库操作

我们实现了预期的功能,但这是在那,例子就是噩梦的开始,青年的…越来越多的需要使用DB组件,如果所有的文字都写了,如果有一天数据库改变了密码或者db改变了,就不回去修改所有的类文件了吗

好的,为了解决这个问题,工厂模式出现了。我们创建了一个工厂方法并通过厂找到DB组件的一个例子::getdb()方法。

类厂{
公共静态函数getdb(){
包含;
返回新的DB(localhost
}
}
示例类变成:

类的例子{

私人_db美元;
功能__construct(){
$this->_db = Factory:: getDb ();
}
功能列表(){
这_db美元-> ->查询(...... );/ /这里特定SQL语句的略写
}
}
这个完美吗想想那,例子,例子…再一次.所有的类的构造函数中工厂你需要::getdb();一个数据库实例,事实上你通过耦合原直接与DB类工厂和工厂类耦合,工厂类是帮助你整理得到的数据库连接信息,虽然变化发生时,数据库的信息只要修改厂时::getdb()方法,但是突然有一天需要改变工厂方法或getdb方法的名字,要改名字,你怎么办当然,这种需求仍然很小,但有时确实如此:

我们不从内部示例类中实例化DB组件,我们依赖外部注入是什么意思请看下面的例子:

类的例子{
私人_db美元;
功能列表(){
这_db美元-> ->查询(...... );/ /这里特定SQL语句的略写
}
来自外部的注入连接
功能setdb($连接){
美元-> _db = $连接;
}
}
调用
新实例();
$例-> setdb(厂::getdb)(DB); / /注塑连接
例如美元->列表();
作为一个结果,示例类从外部类的完全解耦,而且你可以看到,没有工厂方法或DB类在DB类。我们直接将连接实例从外部调用的示例类的setdb方法。这样的例子并不怎么关心的分贝连接生成。

这被称为依赖注入,它不是在代码内部创建依赖项,而是将它作为参数传递,这使得我们的程序更易于维护,减少程序代码的耦合程度,实现松耦合。

它还没有完成,让我们假设示例类,除了DB,使用其他外部类,并且我们正在经历:

$例-> setdb(厂::getdb)(DB); / /注塑连接
$例-> setfile(厂::GetFile)(); / /类文件
例如美元-> setImage(厂::GetImage)(图像); / /注射治疗

我们总是写那么多的书吗疲惫或不

好吧,为了不每次写这么多行代码,我们有一个工厂方法:

类厂{
公共静态函数getexample(){
新实例();
$例-> setdb(厂::getdb)(DB); / /注塑连接
$例-> setfile(厂::GetFile)(); / /类文件
例如美元-> setImage(厂::GetImage)(图像); / /注射治疗
返回的实例;
}
}
示例的实例化更改为:

例:getexample美元=工厂:();
例如美元->列表();
看起来很完美,但是回到工厂方法的第一个场景感觉如何这并不是一个好的解决方案,因此提出了一个概念:容器,也称为IOC容器和DI容器。

我们有各种注射的setXXX方法,代码很长,在很多方面,虽然由一个包装厂的方法,但它是不是很酷,好吧,我们没有setXXX方法,这也没有工厂方法两包装,那么我们该如何实现呢

在这里,我们引入一个约定,其中将一个名为di di的参数引入到示例类的构造函数中,如下所示:

类的例子{
私人_di美元;
功能__construct(DI DI美元){
美元-> _di = $迪;
}
通过db容器获取
功能列表(){
这_di美元-> ->得到('db)->查询(...... );/ /这里特定SQL语句的略写
}
}
$ di =新di();
$
返回新的DB(localhost
});
例如新的例子(di);
例如美元->列表();
二是IOC容器,容器被称为存储各种例子我们可以使用,我们使用$迪->设置()设置一个命名实例数据库,因为回调函数的方式传递的,所以当设置不会立即实例化数据库类,但当二>得到('db美元)当同样,实例化时,对地类的设计也可以被集成到单例模式。
因此,我们只在全局范围内声明一个DI类,将需要注入容器的所有类放入容器中,然后将容器作为构造函数的参数导入到示例中,然后我们可以从示例类中的容器中获取实例。你也可以使用setdi(DI DI美元)进口DI容器的方法。总之,合同是你造的,你很清楚。

因此,引入依赖注入的概念和关键容器概念,剩下的就是在实践中使用和理解它。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部