我正在尝试使用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;
}
}
}
main.php
//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();
这一切都使用过程代码,我也能够在这个方法中插入数据 - 所以它应该工作(我出于明显的安全原因删除了数据库详细信息)。
注意:我已阅读this,但仍无效。
答案 0 :(得分: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;
}
}
正如您所看到的,我所做的就是忽略其他内容,无论self::$db
的价值是什么,您都必须将其退回。但是如果 为null,那么你永远不会进入包含return语句的else
分支。
该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}'));
}
}