有问题的理解两个单例Php代码连接到mongoDb


Having issue with understanding two singleton Php code for conecting to mongoDb

我有这两个代码用来连接到mongodb。

首先我使用这个代码,但这似乎不工作。我不知道为什么。

class DbConnection
{
    static $db = NULL;
    static function getMongoCon()
    {
        if (self::$db === null)
        {
            try {
                $m = new Mongo("mongodb://username:password@localhost:27017");

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

在此之后,我使用这种方式连接mongo在另一个类

   $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:password@localhost: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,并保持它打开,并直接在另一个类中使用。

请简单描述为什么第二段代码可以正常工作,而第一段代码不能正常工作。

在第一段代码中,当$db变量是null并且您创建一个新连接时,您的getMongoCon函数不返回任何,因此当您尝试在示例中使用它时,$db=DbConnection::getMongoCon();最终将null分配给$db变量。

要使其正常工作,您应该这样做:

...
static function getMongoCon()
{
    if (self::$db === null)
    {
        try {
            $m = new Mongo("mongodb://username:password@localhost:27017");
        } catch (MongoConnectionException $e) {
            die('Failed to connect to MongoDB '.$e->getMessage());
        }
        self::$db = $m;
    }
    return self::$db;
}
...