【发布时间】:2012-06-20 07:59:20
【问题描述】:
有一个公共库,有一个类在一个PHP进程中只能有一个实例,所以是Singleton。问题是这个类的初始化需要一些配置参数,我找不到在类构造函数中传递它们的好问题。
我发现的唯一问题是:
public static function init($params) {
if(self::$instance) {
throw new Exception(__CLASS__ . ' already initialized');
}
$class = __CLASS__;
self::$instance = new $class($params);
}
public static function getInstance() {
if(!self::$instance) {
throw new Exception(__CLASS__ . ' is not initialized');
}
return self::$instance;
}
但我觉得这不是很好。还有其他想法吗?
谢谢!
【问题讨论】:
-
单例模式不适用于只能有一个实例的类。它适用于可能有只有一个实例并且需要全局访问点的类。
-
这就是单例很难的原因之一。如果您在应用程序中需要 one 并且需要使用参数对其进行实例化,那么您应该将 one 放置在您编写
new Foo($params)的代码中,然后注入该实例任何需要它的地方...... -
单身人士很少有合法用途,应该避免。 stackoverflow.com/a/9227695/477127
-
@SeniorDev 当然很重要。为了提出正确的解决方案,您需要了解您要解决的问题以及原因。否则,您只是假设这里需要一个 Singleton。所以问领域专家为什么(五次)必须只有一个实例以及当有两个实例时会产生什么后果。大多数情况下,简单地不实例化第二个实例而不是强制执行它就足够了。
-
如果你在运行脚本的不同点需要不同的配置,那真的强烈建议你需要不止一个。