2010-05-05 3 views
0

Ok, c'est tellement bizarre !!! Je cours PHP Version 5.1.6 quand j'essaie et exécute le code ci-dessous il donne une erreur fatale d'un objet qui n'a pas été instancié. Dès que je ne commente pas cette ligne de code // $ cb_db = new cb_db (USER, PASSWORD, NAME, HOST); tout fonctionne. Même si j'ai déclaré l'objet $ cb_db global dans la méthode. Toute aide serait grandement appréciée.Appel à une requête de fonction membre() sur un non-objet

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

Pourquoi utiliseriez-vous global dans une classe? s'étendre semble beaucoup plus approprié, vous pouvez également passer l'objet en tant que paramètre ... – Dormilich

+0

Vous n'avez pas commencé à utiliser des classes pour se débarrasser des globals? –

Répondre

2

Si vous allez utiliser globals (au lieu de passer la connexion par le constructeur), vous devez vous assurer qu'il est Global-ed les deux endroits que vous prévoyez de l'utiliser.

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; 
    } 
} 

Cependant, je crois une meilleure façon de le faire serait en passant la connexion de base de données par le constructeur.

$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; 
    } 
} 

Vous pouvez également passer dans la fonction individuelle (find_by_sql($sql, $cb_db)) si vous trouvez que c'est la seule fonction qui utilise la connexion.