DI是Singleton和/或静态对象的唯一解决方案吗?

dyn*_*mic 8 php oop design-patterns

有人告诉我,单身人士很难测试.

我被告知静态方法/对象也不好.

所以基本上唯一的解决方案似乎是依赖注入.

但是......我真的不能习惯DI,举个例子:

在我的框架中,我有一个管理SQL的类.这个类(以及我的许多其他框架)使用单例Logger来记录消息(以及许多其他帮助程序).

使用DI,我的代码将转向:

global $logger; //> consider i have been instanciated it at the start of my fw

$query = new PreparedQuery($logger);
$query->prepare() etc.
Run Code Online (Sandbox Code Playgroud)

现在这似乎并不太糟糕.但是考虑一个需要许多查询的页面我相信每次$logger在构造函数中编写都是非常多余的,特别是如果你考虑PreparedQuery是否需要构造函数中的许多其他依赖项.

我发现避免单例的唯一解决方案是在主应用程序中使用一个方法(或只是一个简单的函数)来存储对这个辅助对象(Service Locator/Container)的每个引用,但这并不能解决隐藏的问题依赖关系

那么除了DI以外你的体验是什么样的好模式?

解:

对于每个人来说,PHPunit的创建者解释了如何解决Singleton问题(以及如何使用PHP 5.3解决静态方法测试问题)

如果你问我,那很有意思.

eri*_*len 1

日志记录通常是静态单例可以使用的示例无论如何,您不需要嘲笑您的日志记录,对吗?

  • @yes123:它们一点也不坏,但它们经常被滥用,这导致了低声誉。然而,在某些情况下它们是有用的(而且还不错;)) (3认同)