0

我正在尝试熟悉 PHP,并遇到了我现在要描述的问题。

基本上,我有一个具有以下结构的父类:

abstract class DBConn {
    protected $con;

    abstract function __construct($host, $user, $pass);
    abstract function GetConnectionString($host, $user, $pass);
}

另外,我有一个带有以下代码的子类:

class MongoDBConn extends DBConn {
    private $col;

    private function __construct($host, $user, $pass) {
        try {
            $server = Self::GetConnectionString($host, $user, $pass);
            $this->con = (new MongoClient($server))->selectDB('sicom');
        } catch (MongoConnectionException $ex) {
            $em = 'Connection error';
            throw new Exception($em, ERR_DB_CONN, $ex);
        }
    }

    public function GetConnectionString($host, $user, $pass) {
        return "mongodb://" . $user . ":" . $pass . "@" . $host;
    }
}

这似乎不起作用。我使用以下 PHP 测试代码:

// Contains class MongoDBConn
require $_SERVER['DOCUMENT_ROOT'] . "/knl/db/dbconn-mongo.php";
// Contains SICOM_* values
require $_SERVER['DOCUMENT_ROOT'] . "/knl/config.db.php";

$dx = new MongoDBConn(SICOM_DB_HOST,SICOM_DB_USER,SICOM_DB_PASSWORD);
var_dump($dx);

而且我没有收到转储,可能是因为 $dx 为 NULL。

我没有足够的 PHP 经验来知道是什么导致了这个问题,我也没有足够的 nginx(我正在使用的 Web 服务器)知道在哪里寻找。有人可以帮我找到解决方案吗?

谢谢!

编辑:我根据建议修改了代码,但实现了以下几点:虽然我的测试文件使用了两个 REQUIRE,但声明 MongoDBConn 类的文件使用了更多。当我尝试使用“REQUIRE ...dbconn-mongo.php”时,主页崩溃。是因为我不能在也使用 REQUIRE 的文件中包含 REQUIRE 吗?如果是这样,有什么解决方法?(所需文件之一包含返回代码;另一个包含字段名称,依此类推。)

4

2 回答 2

1

公开您的构造函数。否则它根本不会被调用,也不会创建数据库连接。

于 2013-10-07T01:29:58.883 回答
0

有两种方法可以做到这一点。

首先是公开 __construct。这样您就可以创建 MongoDBConn 的实例。

但是,由于这是一个 DB 连接并且您可能希望它是单例的,您可能需要编写一个 getInstance 方法。

class MongoDBConn extends DBConn {
private $col;
private $_instance = false;
private function __construct($host, $user, $pass) {
    try {
        $server = Self::GetConnectionString($host, $user, $pass);
        $this->con = (new MongoClient($server))->selectDB('sicom');
    } catch (MongoConnectionException $ex) {
        $em = 'Connection error';
        throw new Exception($em, ERR_DB_CONN, $ex);
    }
}

public function GetConnectionString($host, $user, $pass) {
    return "mongodb://" . $user . ":" . $pass . "@" . $host;
}
public function getInstance($host = false, $user = false, $pass = false){
    if($this->_instance === false){
        if($host === false || $host === false || $host === false)
            throw new Exception('You must pass arguments at first MongoDBConn::GetInstance() Call');
        $_instance = new MongoDbConn($host, $user, $pass);
    }
    return $this->_instance

}

}

这样你就确定没有人建立 2 个连接。我认为您应该更需要第二种方式。在没有全局单词并将 MongoDBConn 对象作为参数传递的类中获取实例更容易。它会让你的代码保持干净。

@Edit:增加了对传递主机、用户和密码的支持。

于 2013-10-07T01:39:17.900 回答