【发布时间】:2011-03-08 18:07:51
【问题描述】:
我在一个 web 应用程序框架中工作,其中一部分由许多服务组成,所有服务都实现为单例。它们都扩展了一个 Service 类,其中实现了单例行为,看起来像这样:
class Service {
protected static $instance;
public function Service() {
if (isset(self::$instance)) {
throw new Exception('Please use Service::getInstance.');
}
}
public static function &getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
现在,如果我有一个像这样实现的名为 FileService 的类:
class FileService extends Service {
// Lots of neat stuff in here
}
...调用 FileService::getInstance() 不会像我想要的那样产生 FileService 实例,而是一个 Service 实例。我认为这里的问题是服务构造函数中使用的“self”关键字。
还有其他方法可以在这里实现我想要的吗?单例代码只有几行,但我仍然希望尽可能避免任何代码冗余。
【问题讨论】:
标签: php inheritance singleton anti-patterns