2017-05-18 4 views
0

私は2つのdbを持っており、私は実際にシングルトンパターンである私のDbクラスからそれらの1つを返したいと思います。だから、毎回新しい接続をしたくないのですが、接続が配列内に存在するかどうかを確認してから、それを返すようにします。問題は、getInstanceメソッドから戻ってくるのは、同じDbオブジェクトでPDOオブジェクトではないということだけです。シングルトンパターンは複数のdbで動作しません

class Db 
{ 
    public static $dbTypes = []; 

/** 
* Db constructor. 
* @param $db 
*/ 
private function __construct($db) 
{ 
    switch ($db) { 
     case ConfigManager::getDbDatabase(true): 
      try { 
       self::$dbTypes[$db] = new \PDO("mysql:host=" . ConfigManager::getDbHost(true) . ";dbname=" . ConfigManager::getDbDatabase(true) . ";charset=utf8", ConfigManager::getDbUser(true), ConfigManager::getDbPass(true)); 
      } catch (\PDOException $ex) { 
       echo $ex->getMessage(); 
      } 
     break; 
     case ConfigManager::getDbDatabase(false): 
      try { 
       self::$dbTypes[$db] = new \PDO("mysql:host=" . ConfigManager::getDbHost(false) . ";dbname=" . ConfigManager::getDbDatabase(false) . ";charset=utf8", ConfigManager::getDbUser(false), ConfigManager::getDbPass(false)); 
      } catch (\PDOException $ex) { 
       echo $ex->getMessage(); 
      } 
     break; 
    } 

} 

/** 
* @throws \Exception 
*/ 
private function __clone() 
{ 
    throw new \SoapFault('CODE_ERROR', 'You can not clone ' . __CLASS__ . ' class.'); 
} 

/** 
* @param $db 
* @return \PDO 
*/ 
public static function getInstance($db) : \PDO 
{ 
    if (!array_key_exists($db, self::$dbTypes)) { 
     self::$dbTypes[$db] = new self($db); 
    } 
    return self::$dbTypes[$db]; 

} 

}

CONFIGMANAGERクラスがあなたを混同してはいけない、設定ファイルから値を取得するだけでゲッタークラスです。基本的に、ConfigManagerメソッドのparamがtrueの場合は最初のdbが返され、falseの場合は2番目のdbの値が返されます。そして、私はこのようなPDOを使用したい:

$this->db = Db::getInstance(ConfigManager::getDbDatabase(true)); 
    $query = $this->db->prepare("SELECT c.extern_username... 

私は「::未定義のメソッドヘルパー\ ConfigHelpers \ DBへの呼び出し()の準備」エラーを取得しています。お知らせ下さい。

+0

ようにそれを使用するには、あなたはvar_dumpingます$ this->デシベルを試みたことがありますか? PDOインスタンスではない可能性があります。また、ConfigManager :: getDbDatabase(true)は何を返しますか? – Andreas

+0

私はphp stormでデバッグします。$ this-> dbは無限の配列で、paramがtrueの場合はConfigManager :: getDbDatabase(true)は最初のdb名を返し、paramがfalseの場合は2番目のdb nameを返します。他のすべてのConfigManagerメソッドは同じ方法で動作します。 – belijja

+0

そして、私が 'error_log(" Dbの戻り値 "var_export($ this-> db、true));'を得ると、ヘルパー\\ ConfigHelpers \\ Db :: __ set_state(配列(\ n))**ログファイルに保存します。 – belijja

答えて

0

解決策が見つかりました。私は新しい非静的なプロパティを追加し、スイッチの大文字小文字の後の配列にそのプロパティを追加し、getInstanceメソッドからそれを返します。

class Db 
{ 
private static $dbTypes = []; 
private $pdo; 

/** 
* Db constructor. 
* @param $db 
*/ 
private function __construct($db) 
{ 
    switch ($db) { 
     case ConfigManager::getDbDatabase(true): 
      try { 
       $this->pdo = new \PDO("mysql:host=" . ConfigManager::getDbHost(true) . ";dbname=" . ConfigManager::getDbDatabase(true) . ";charset=utf8", ConfigManager::getDbUser(true), ConfigManager::getDbPass(true)); 
      } catch (\PDOException $ex) { 
       echo $ex->getMessage(); 
      } 
     break; 
     case ConfigManager::getDbDatabase(false): 
      try { 
       $this->pdo = new \PDO("mysql:host=" . ConfigManager::getDbHost(false) . ";dbname=" . ConfigManager::getDbDatabase(false) . ";charset=utf8", ConfigManager::getDbUser(false), ConfigManager::getDbPass(false)); 
      } catch (\PDOException $ex) { 
       echo $ex->getMessage(); 
      } 
     break; 
    } 
    self::$dbTypes[$db] = $this->pdo; 
} 

/** 
* @throws \Exception 
*/ 
private function __clone() 
{ 
    throw new \SoapFault('CODE_ERROR', 'You can not clone ' . __CLASS__ . ' class.'); 
} 

/** 
* @param $db 
* @return \PDO 
*/ 
public static function getInstance($db) : \PDO 
{ 
    if (!array_key_exists($db, self::$dbTypes)) { 
     self::$dbTypes[$db] = new self($db); 
    } 
    return self::$dbTypes[$db]->pdo; 

} 
} 

、その後、あなたはこの

$this->db = Db::getInstance(ConfigManager::getDbDatabase(true)); 

のようにそれを呼び出すと、この

$query = $this->db->prepare("SELECT c.e... 
関連する問題