我想确保在创建对象时不启动多个数据库连接。 作为OOP的新手,我想第一次做到这一点。
我正在使用MongoDB
//connect to mongodb
$dbhost = 'localhost';
$dbname = 'test';
$mongo = new Mongo("mongodb://$dbhost");
所以这是创建数据库对象。 我读到最好在类中使用依赖注入,如下所示。
class Database {
protected $dbc; //database connection
protected $db; //database
function __construct(Mongo $mongo, $dbname) {
$this->dbc = $mongo;
$this->db = $this->dbc->$dbname;
}
}
使用以下方法创建对象:
$db = new Database($mongo, $dbname);
我可以在Database类中使用MongoDB连接而没有任何问题。
由于我正在创建一个REST服务器,我想将我的Database类拆分为每个方法(PUT,GET,DELETE等)。所以,我认为最好扩展Database类,然后只为服务器请求的方法创建一个对象。
class GetDatabase extends Database {
//do my GET stuff in here
//use the Mongo connection in the parent contruct
}
我需要运行的不仅仅是来自GetDatabase类的查询,因为我有一个需要使用数据库连接的Auth类(不扩展数据库)。
任何人都可以提供有关如何更好地完成这项工作或确保只创建一个数据库连接的建议吗?
谢谢!
答案 0 :(得分:-1)
而不是使用代码
//connect to mongodb
$dbhost = 'localhost';
$dbname = 'test';
$mongo = new Mongo("mongodb://$dbhost");
我建议您使用以下代码。
class CMongo {
private static $mongo_conn = null;
public static function connection(){
if(!self::$mongo_conn){
$dbhost = 'localhost';
$dbname = 'test';
try{
self::$mongo_conn = new Mongo("mongodb://$dbhost");
}
catch(Exception $e){
$error_msg = $e->getMessage();
}
}
return self::$mongo_conn;
}
}
$mongo = CMongo::connection();
上述代码将确保仅new Mongo("mongodb://$dbhost");
被调用一次。同样,try {} catch {}
块将确保当mongo关闭或无法访问时,程序不会因致命错误而终止。