1

我正在尝试使用 OOP PHP 访问我的 mongodb 集合。然而在页面上它什么也没返回,但是当我查看我的 apache 错误日志时,它指出

PHP 注意:试图在第 22 行的 main.php 中获取非对象的属性

这是我正在使用的代码:db.php

class db {
    static $db = NULL;

    static function getMongoCon()
    {
        if (self::$db === null)
        {
            try {
                $m = new Mongo('mongodb://{user}:{password}@{host}:{port}/{database}');

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

主文件

//load db files
require_once('db.php');

class test{
   public function __construct() {
       echo $this->output();
   } 
   public function output() {
       $con=db::getMongoCon();
       $db=$con->database;
       $test=$db->collection;
       $n=$test->find();
       print_r($n);
   } 
}

new test();

这一切都使用过程代码工作,我也能够在这种方法中插入数据 - 所以它应该工作(出于明显的安全原因,我在这里删除了数据库详细信息)。

注意:我已阅读内容,但仍然无法正常工作。

4

1 回答 1

2

这是一个非常简单的错误。您正在使用工厂模式,但第一次调用该getMongoCon方法时,它将返回 null:

class Db
{//convention: Upper-Case classes
    private static $_db = null;//using this pattern a public static is a bad idea
    public static function getMongoCon()
    {//^^ best specify public/private/protected
        if (self::$db === null)
        {//first time called: this is true
            try {
                //I'd assign immediatly here, but hey...
                self::$db = new Mongo('mongodb://{user}:{password}@{host}:{port}/{database}');
                $m = new Mongo('mongodb://{user}:{password}@{host}:{port}/{database}');
            }
            catch (MongoConnectionException $e)
            {
                die('Failed to connect to MongoDB '.$e->getMessage());
            }
            self::$db = $m;
        }
        //!!leave out else to fix!!
        return self::$db;
    }
}

正如你所看到的,我所做的只是忽略了 else,不管它的价值self::$db 什么,你都必须返回它。但如果它空,您将永远无法进入else包含 return 语句的分支。该阻止
也没有真正的原因。throw-catch您显然依靠该数据库连接来使您的代码工作,如果它不只是,没有备份 AFAIK,所以让它抛出(并停止)。

为了完整起见,以下是我编写上述代码的方式:

class Db
{
    private static $_db = null;
    public static function getMongoCon($new = false)
    {//allow for another connection, you never know...
        if (self::$_db === null)
        {
            self::$_db = new Mongo('mongodb://{user}:{password}@{host}:{port}/{database}');
        }
        if (true === !!$new)
        {
            return new Mongo('mongodb://{user}:{password}@{host}:{port}/{database}');
        }
        return self::$_db;
        //or, short 'n messy:
        return (!$new ? self::$_db : new Mongo('mongodb://{user}:{password}@{host}:{port}/{database}'));
    }
}
于 2013-04-25T14:46:02.897 回答