2013-03-16 43 views
1

我有這兩個代碼來連接到mongodb。理解兩個singleton Php代碼連接mongodb的問題

首先我使用這段代碼,但這似乎並沒有工作,我不知道爲什麼。

class DbConnection 
{ 
    static $db = NULL; 

    static function getMongoCon() 
    { 
     if (self::$db === null) 
     { 
      try { 
       $m = new Mongo("mongodb://username:[email protected]:27017"); 


      } catch (MongoConnectionException $e) { 
       die('Failed to connect to MongoDB '.$e->getMessage()); 
      } 
      self::$db = $m; 
     } 
     else 
     { 
      return self::$db; 
     } 
    } 
} 

在此之後我用這樣的方式在另一個類

$db=DbConnection::getMongoCon(); 
    $database=$db->databasename; 
    $collection=$db->users; 

連接蒙戈但這似乎並不總是工作。我總是得到錯誤$ db未定義或一些其他未定義的錯誤。

第二個代碼是這樣的。我用它連接到MongoDB而無需創建多個連接。這工作正常,沒有問題。

class DbConnection{ 

    static protected $_instance; 

    protected $db = null; 

    final protected function __construct() { 
     $m = new Mongo("mongodb://username:[email protected]:27017"); 
     $this->db = $m->selectDB("databasename"); 
    } 

    static public function getInstance() { 
     if (!(self::$_instance instanceof self)) { 
      self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function getConnection() { 
     return $this->db; 
    } 

    final protected function __clone() { } 
} 

要在其他類使用此代碼我用

$db=DbConnection::getInstance()->getConnection(); 

     $collection=$db->users; 

我不知道爲什麼第二個工作,但不是第一個代碼。如果我在mysql中同時使用這兩個工作正常。 也可以這個問題比第二個代碼我已創建連接到Mongodatabase並保持打開並直接在另一個類中使用。

請描述爲什麼第二個代碼工作正常,並且第一次沒有工作。

回答

2

在第一段代碼,當$db變量是null並創建一個新的連接時,您getMongoCon功能不返回任何,因此,當您嘗試使用它的例子,$db=DbConnection::getMongoCon();結束跌宕asigning null$db變量。

爲了使它正常工作,你應該做這樣的事情:

... 
static function getMongoCon() 
{ 
    if (self::$db === null) 
    { 
     try { 
      $m = new Mongo("mongodb://username:[email protected]:27017"); 

     } catch (MongoConnectionException $e) { 
      die('Failed to connect to MongoDB '.$e->getMessage()); 
     } 
     self::$db = $m; 
    } 

    return self::$db; 
} 
...