我们都知道单身人士是多么糟糕,因为它们隐藏了依赖以及其他原因。
但是在一个框架中,可能有许多对象仅需要实例化一次,并可以从任何地方调用(记录器,数据库等)。
为了解决这个问题,我被告知要使用所谓的“对象管理器”(或类似symfony的服务容器)在内部存储对服务(记录器等)的所有引用。
但是,为什么服务提供者不像单纯的Singleton那样糟糕?
服务提供者也隐藏了依赖关系,他们只是包装了第一个实例的创建。因此,我真的很难理解为什么我们应该使用服务提供商而不是单例。
PS。我知道不隐藏依赖项应该使用DI(如Misko所述)
加
我会补充:现在,单例并没有那么邪恶,PHPUnit的创建者在这里解释了这一点:
DI + Singleton解决了以下问题:
<?php
class Client {
public function doSomething(Singleton $singleton = NULL){
if ($singleton === NULL) {
$singleton = Singleton::getInstance();
}
// ...
}
}
?>
即使这不能解决所有问题,这还是很聪明的。
除了DI和Service Container 之外,还有什么好的可接受的解决方案来访问此帮助对象?