2010-05-05 46 views
0

好吧,這太奇怪了!當我嘗試運行下面的代碼時,我正在運行PHP版本5.1.6,它給出了一個尚未實例化的對象的致命錯誤。只要我取消註釋此行代碼 // $ cb_db = new cb_db(USER,PASSWORD,NAME,HOST); 一切正常。即使我已經在方法中將$ cb_db對象聲明爲全局的。任何幫助將不勝感激。調用一個非對象的成員函數query()

require_once(ROOT_CB_CLASSES。'db.php');

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 

class cb_user { 
    protected function find_by_sql($sql) { 
     global $cb_db; 

     //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 
     $result_set = $cb_db->query($sql); 

     $object_array = array(); 
     while($row = $cb_db->fetch_array($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array; 
    } 
} 
+1

你爲什麼要在課堂上使用全局?擴展似乎更合適,你也可以傳遞對象作爲參數... – Dormilich 2010-05-05 22:58:07

+0

沒有開始使用類來擺脫全局? – 2010-05-05 23:01:34

回答

2

如果你要使用全局變量(而不是通過構造函數的連接),你應該確保它是全球-ED,你打算使用它這兩個地方。

Global $cb_db; 
$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 

class cb_user { 
    protected function find_by_sql($sql) { 
     global $cb_db; 

     //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 
     $result_set = $cb_db->query($sql); 

     $object_array = array(); 
     while($row = $cb_db->fetch_array($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array; 
    } 
} 

但是,我相信一個更好的方法來做到這一點將是通過構造函數傳遞數據庫連接。

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST); 
$cb_user = new cb_user($cb_db); 

class cb_user { 
    public __construct(cb_db $database) 
    { 
     $this->database = $database 
    } 

    protected function find_by_sql($sql) { 

     $this->database = new cb_db(USER, PASSWORD, NAME, HOST); 
     $result_set = $cb_db->query($sql); 

     $object_array = array(); 
     while($row = $cb_db->fetch_array($result_set)) { 
      $object_array[] = self::instantiate($row); 
     } 
     return $object_array; 
    } 
} 

你也可以在將它傳遞給各個功能(find_by_sql($sql, $cb_db))如果你發現這是一個使用連接的唯一功能。

相關問題