1

公開ライブラリがあり、1 つの PHP プロセスに 1 つのインスタンスしか持てないクラスがあるので、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

なんで2回チェックするの?

次の手順を実行してください。

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

コンストラクターはprivateであるため、クラス自体からのみ呼び出すことができることに注意してください。インスタンスへの参照は、最初の呼び出しでオブジェクトを作成するgetInstance呼び出しによってのみ取得できます。その後の呼び出しでは、既存のオブジェクトへの参照が返されます。

于 2012-06-18T11:15:58.757 に答える