2011-04-07 116 views
0

假設我有這樣的:方法依賴於現場

class Validator { 
    private $db; 

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

    // Queries 
    } 
} 

假設$ DB-對象是在構造函數中創建(或$ DB-對象被賦予作爲構造函數的參數)。

問題是,所有必須使用$ db-object的方法都需要首先檢查這個對象是否真的存在。數據庫連接可能因多種原因失敗。如果它不存在並且沒有進行檢查,腳本將會崩潰(「非對象方法」 - 錯誤)。

有沒有辦法解決這個問題?在每種方法中檢查對象聽起來都不正確。或者是?

謝謝

回答

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模式的構造。