2010-11-27 5 views
1

Problème étrange. J'ai utilisé Singleton plusieurs fois, mais ce cas particulier ne veut tout simplement pas fonctionner. Dump dit que l'instance est nulle.PHP OOP singleton ne renvoie pas d'objet

define('ROOT', "/"); 
define('INC', 'includes/'); 
define('CLS', 'classes/'); 

require_once(CLS.'Core/Core.class.php'); 

$core = Core::getInstance(); 

var_dump($core->instance); 

$core->settings(INC.'config.php'); 
$core->go(); 

Catégorie de base

class Core 
{ 
    static $instance; 

    public $db; 
    public $created = false; 

    private function __construct() 
    { 
     $this->created = true; 
    } 

    static function getInstance() 
    {  
     if(!self::$instance) { 
      self::$instance = new Core(); 
     } else { 
      return self::$instance; 
     } 
    } 

    public function settings($path = null) 
    { 
     ... 
    } 
    public function go() 
    { 
     ... 
    } 

} 

code d'erreur

Fatal error: Call to a member function settings() on a non-object in path 

Il est peut-être une faute de frappe stupide, mais je n'ai aucune erreur dans mon éditeur. Merci pour les réponses rapides comme toujours.

Répondre

9

Vous devez toujours retourner l'objet singleton de la méthode singleton, ici vous n'êtes pas parce que vous avez une déclaration else, donc la première invocation de getInstance ne retournera rien:

static function getInstance() 
{  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } else { 
     return self::$instance; 
    } 
} 

Votre méthode singleton devrait ressembler à ceci:

static function getInstance() 
{  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } 
    return self::$instance; 
} 

de plus, ayant une variable d'instance indiquant si un objet a été créé est à peu près inutile, parce que vous pouvez les comparer if(self::$instance !== NULL) et vous êtes bon pour aller.

+1

+1 Aussi, je pense que le bit '$ this-> created' (dans l'OP) est un peu inutile, parce que techniquement' (self :: $ instance! == null) 'et' $ this-> created == true' sont équivalents. – netcoder

+0

@netcoder Merci, ajouté. –

+0

Je sais maintenant - mais je ne savais pas que j'avais cette erreur. Merci – Misiur

2

getInstance devrait toujours retourner une valeur - doit changer comme ceci:

static function getInstance() 
{  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } 
    return self::$instance; 
} 
0

En plus besoin de changer votre méthode getInstance() à:

static function getInstance() {  
    if(!self::$instance) { 
     self::$instance = new Core(); 
    } 
    return self::$instance; 
} 

... vous essayez également de déréférencer $ instance de l'instance elle-même dans l'appel suivant:

var_dump($core->instance); 

Vous devez soit vérifierez:

var_dump($core); 

ou

var_dump(Core::$instance); 

... qui, après que le noyau de $ = base :: getInstance() appel, devrait être le même objet.