我的PHP类中的自定义构造函数不起作用

时间:2013-10-07 01:24:28

标签: php mongodb constructor nginx

我正在尝试熟悉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?如果是这样,那么解决方法是什么? (其中一个必需文件包含返回代码;另一个包含字段名称,依此类推。)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

有两种方法可以做到。

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

但是,由于这是一个数据库连接,你可能希望它是单例,你可能想编写一个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:添加了对传递主机,用户和密码的支持。