1

有一个公共库,有一个类在一个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;
}

但我不认为它真的很好。还有其他想法吗?

谢谢!

4

4 回答 4

0

有一个不好但有效的问题的例子:

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;
  }
}
于 2012-06-18T11:27:45.650 回答
0
/* 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; 
}
于 2012-06-18T13:10:53.933 回答
-1

为什么要检查两次?

只需执行以下操作:

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()。

于 2012-06-18T11:29:21.667 回答
-1

示例单例实现:

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;
   }
}

请注意,构造函数是私有的,因此只能从类本身调用。实例的引用只能通过getInstance调用获得,它在第一次调用时创建对象,任何后续调用都将返回对现有对象的引用。

于 2012-06-18T11:15:58.757 回答