[英]Singleton initialization configuration
有一个公共库,并且有一个类在一个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;
}
但是我不认为这真的很好,还有其他想法吗?
谢谢!
有一个坏的例子,但工作的问题:
if(!defined('PSEOUDSINGLETON_PARAM')) {
define('PSEOUDSINGLETON_PARAM', 'default value');
}
class PseoudoSingleton {
protected function __construct($param1 = PSEOUDSINGLETON_PARAM) {
// ...
}
public static function getInstance() {
if(!self::$instance) {
$class = __CLASS__;
self::$instance = new $class();
}
return self::$instance;
}
}
/* on library/utility level */
class nonSingletonService { public function __construct($options){} }
/* on application logic level, so, knows all context */
function getSingleton(){
static $inst;
if (!$inst) $inst=new nonSingletonService(calculateParameters());
return $inst;
}
单例实现示例:
class MySingleton
{
private static $_INSTANCE = null;
private function __construct()
{
// put initialization code here
}
public static function getInstance()
{
if(self::$_INSTANCE === null) self::$_INSTANCE = new MySingleton();
return self::$_INSTANCE;
}
}
请注意,构造函数是private ,因此只能从类本身调用它。 对实例的引用只能通过getInstance调用获得,该调用在第一次调用时创建对象,任何后续调用都将返回对现有对象的引用。
为什么要检查两次?
只需执行以下操作:
private static function init($params) {
$class = __CLASS__;
self::$instance = new $class($params);
}
public static function getInstance($params) {
if(!self::$instance) {
self::init($params);
}
return self::$instance;
}
这样,您知道只需要检查一次,并且知道如果实例未初始化,则仅调用init()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.