我们都知道 坏单身汉是什么样的,因为它们隐藏了依赖项和 其他原因。
但是在一个框架中,可能有许多对象只需要实例化一次,并称为 来自世界各地(logger、 db 等)。
为了解决这个问题,我被告知使用一个所谓的“对象管理器”(或类似 symfony 的 服务容器) ,它在内部存储对服务(logger 等)的每个引用。
但是为什么一个服务提供商不像一个纯粹的 Singleton 那么糟糕呢?
服务提供者也隐藏了依赖关系,它们只是结束了第一个实例的创建。所以我真的很难理解为什么我们应该使用一个服务提供商而不是单一的。
我知道为了不隐藏依赖关系,我应该使用 DI (如 Misko 所说)
我想补充一点: 现在单例并不是那么邪恶,PHPUnit 的创建者在这里解释道:
DI + Singleton 解决了这个问题:
<?php
class Client {
public function doSomething(Singleton $singleton = NULL){
if ($singleton === NULL) {
$singleton = Singleton::getInstance();
}
// ...
}
}
?>
即使这并不能解决所有问题,这也很聪明。
除了 DI 和服务容器 有没有什么好的可以接受的解决方案访问这个帮助器对象?