假设我有这个:
class Validator {
private $db;
public checkIfUsernameAlreadyExists($username) {
if (!$this->db)
return false;
// Queries
}
}
假设在构造函数中创建了$ db-object(或者在构造函数中将$ db-object作为参数提供)。
问题是所有必须使用$ db-object的方法都需要先检查这个对象是否真的存在。数据库连接可能由于多种原因而失败。如果它不存在且未进行检查,则脚本将崩溃(“非对象上的方法” - 错误)。
有没有办法解决这个问题?检查每种方法中的对象听起来不正确。或者是吗?
谢谢
答案 0 :(得分:2)
检查每种方法中的对象绝对不对。
构造函数参数的目的是在实例化后使用一个有效的对象:
class Validator {
private $db;
public function __construct(PDO $db) {
// validate $db here
}
public checkIfUsernameAlreadyExists($username) {
$this->db->query('SELECT * FROM table'); // exception thrown here
// never reaches here
}
}
try {
$validator = new Validator(new PDO('mysql:dbname=db', 'user', 'pass'));
$validator->checkIfUsernameAlreadyExists('foo');
} catch (PDOException $e) {
echo 'Database error occured: ', $e->getMessage();
exit(1);
}
因此,您在构造函数中验证$db
一次,就是这样。如果数据库连接失败,则$db
对象应该(并且如果它是PDO)抛出一个异常,这将暂停该方法的执行。
注意:由于很多原因可以在Stack Overflow或Google上找到,我不鼓励使用Singleton模式或全局变量。
答案 1 :(得分:0)
你的类的构造函数应该处理这种检查,例如:
class Validator {
public function __construct($db) {
if($db != null && $db->isConnected()) {
$this->db = $db;
}
else
throw Exception("Database error!");
}
}
您也可以将Singleton模式用于数据库对象。