我正在尝试熟悉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?如果是这样,那么解决方法是什么? (其中一个必需文件包含返回代码;另一个包含字段名称,依此类推。)
答案 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:添加了对传递主机,用户和密码的支持。