首先,依赖注入和反转
控制是同一件事,是一种设计
模式,这种设计模式是用来减少
程序之间的耦合,我研究过它,看到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容器的方法。总之,合同是你造的,你很清楚。
因此,引入依赖注入的概念和关键容器概念,剩下的就是在实践中使用和理解它。