2

当我第一次看到 PHP-DI、Symfony2 DI 等依赖注入组件时,我发现有一种方法可以通过一个实例化自动将任何类的实例注入到任何类中。

所以1.像2一样在根类中创建实例$foo = new Foo() 。然后我可以在任何对象(如全局单例)中使用这个实例,而无需传递对我要调用的类的构造函数或方法的引用。

但我发现,基本上我可以通过两种方式使用依赖注入 1. 将实例的引用传递给构造函数 2. 创建所有对象所在的容器。此容器可以注入其他类,但“不推荐”。

由于这两种方法都可以在纯 PHP 中轻松完成,第一种很清楚,第二种可以通过静态属性解决,那么为什么要使用 PHP-DI 或 Symfony2 来完成这项工作呢?

4

1 回答 1

2

为什么要在单例模式上使用依赖注入?

假设我们有一个名为 Singleton 的对象DatabaseConnection,它为我们包装了一个到 MySQL 数据库的连接,并做了一些其他巧妙的事情,谁知道呢。因为重用代码是一件好事,所以我们在很多项目中都会用到这个对象。

如果在某个时候我们决定将我们的一个项目从 MySQL 切换到另一个数据库产品怎么办?我们将不得不修改我们调用对象的每个地方,DatabaseConnection并用我们的新实现替换它。或者,我们可以修改类本身——但我们仍然想在其他项目中使用原来的类,所以我们最终得到了两个同名的实现,这只是自找麻烦,真的。

那么单元测试呢?当然,我们这样做是因为我们是优秀的开发人员!但是如果我们对一个使用数据库的函数进行单元测试,我们不希望测试实际上依赖于数据库,甚至不希望改变那里的东西。无法DatabaseConnection用模拟对象(仅返回静态数据)替换 ,因为我们的项目与它紧密耦合。

这就是依赖注入的作用:它有助于防止紧密耦合。如果我们用 注入连接$someObject->setDatabaseConnection($databaseConnection),我们可以在那里注入任何行为与原始对象相似的对象。我们可以注入模拟对象、替代实现或继承原始类的扩展。

现在,依赖注入容器只是一个很好的帮手,可以更轻松地管理对象实例及其依赖关系,但在进行依赖注入时不需要它。

于 2015-03-07T21:41:24.583 回答