方法取决于领域

时间:2011-04-07 20:37:38

标签: php oop

假设我有这个:

class Validator {
  private $db;

  public checkIfUsernameAlreadyExists($username) {
    if (!$this->db)
      return false;

  // Queries
  }
}

假设在构造函数中创建了$ db-object(或者在构造函数中将$ db-object作为参数提供)。

问题是所有必须使用$ db-object的方法都需要先检查这个对象是否真的存在。数据库连接可能由于多种原因而失败。如果它不存在且未进行检查,则脚本将崩溃(“非对象上的方法” - 错误)。

有没有办法解决这个问题?检查每种方法中的对象听起来不正确。或者是吗?

谢谢

2 个答案:

答案 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模式用于数据库对象。