2011-04-07 12 views
0

Предположим, у меня есть это:Методы зависит от поля

class Validator { 
    private $db; 

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

    // Queries 
    } 
} 

Предположим $ дб-объект был создан в конструкторе (или $ DB-объект был задан в качестве параметра в конструкторе).

Проблема в том, что все методы, которые должны использовать объект $ db, необходимо сначала проверить, действительно ли этот объект существует. Соединение с базой данных может завершиться по нескольким причинам. Если он не существует, и проверка не была выполнена, скрипт выйдет из строя («метод на не-объекте» -error).

Есть ли способ обойти эту проблему? Проверка объекта в каждом методе не соответствует правильному пути. Или это?

Спасибо

ответ

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) выдать исключение, которое в любом случае остановит выполнение метода.

Примечание: Я бы отговорил использовать шаблон Singleton или глобальные переменные по многим причинам, которые можно легко найти в Stack Overflow или Google.

0

Конструктор вашего класса должен обрабатывать этот вид проверки и т.д .:

class Validator { 
    public function __construct($db) { 
     if($db != null && $db->isConnected()) { 
      $this->db = $db; 
     } 
     else 
      throw Exception("Database error!"); 
    } 
} 

Вы также можете использовать шаблон Singleton для объекта базы данных.

Смежные вопросы