2010-07-20 4 views
2

Je m'excuse pour le titre peu clair, je ne peux pas penser à un meilleur. Je reçois cette erreur:Classe PHP non existant dans le constructeur

Fatal error: Call to a member function query() on a non-object

Ceci est causé par le constructeur dans une classe SPConfig, qui peut être vu avec une classe SPClasses comme suit:

$sp = new SPClasses(); 

class SPClasses 
{ 
    public $db, $config, $page, $users; 

    function __construct() 
    {  
     // The SPDatabase class [...] 
     $this->db = new SPDatabase(); 

     // The SPConfig class [...] 
     $this->config = new SPConfig(); 

     // [...] 

     // The SPTemplate class [...] 
     $this->page = new SPTemplate(); 

     // The SPUsers class [...] 
     $this->users = new SPUsers(); 
    } 
} 

class SPConfig 
{ 
    function __construct() 
    { 
     global $sp; 
     $configquery = $sp->db->query("SELECT * FROM config", 'Retrieving the configuration'); 
     while($row = mysql_fetch_array($configquery)) 
     { 
      try 
      { 
       $this->{$row['name']} = $row['value']; 
      } 
      catch (Exception $e) 
      { 
       $debug_log[] = array(
        'type' => 'error', 
        'success' => false, 
        'text' => 'The config setting <i>' . $row['config_value'] . '</i> has an invalid name.' 
       ); 
      } 
     } 
    } 


    public function update() 
    { 
     $this->__construct(); 
    } 
} 

Est-ce que quelqu'un sait pourquoi il est impossible pour moi d'accéder $sp->db dans le constructeur SPClasses?

Merci.

+0

Pouvez-vous afficher le message d'erreur? – NawaMan

+0

@NawaMan - À quoi sert le nom de fichier et le numéro de ligne? – unrelativity

Répondre

4

Jusqu'à ce que $sp soit construit et affecté, il n'a pas de valeur. Chose est, le constructeur tente de créer un SPConfig, qui tente d'accéder à la $sp encore-null. Pour que cela fonctionne, le constructeur doit passer le $this ou le au constructeur SPConfig.

+0

Cette réponse était plus claire, merci. – unrelativity

3

Vous avez un problème d'œuf de poule. Tout en affectant le $sp global vous instanciez l'objet SPClasses qui instancie SPCOnfig qui accède à $sp qui n'est pas encore assigné.

passer l'objet SPClasses en tant que paramètre à la classe SPConfig et vous êtes bien.

Questions connexes