2010-10-05 9 views
0

J'essaie d'utiliser la méthode singleton pour accéder à un objet global (dans cet exemple, son "nom d'utilisateur"). Ma question est comment puis-je modifier cela afin que dans la fonction DB->connect() je pourrais faire echo $this->username;sans en déclarant $ nom d'utilisateur ou en changeant les 2 dernières lignes?Utilisation de la méthode singleton pour créer un objet global

class CI_Base { 

    private static $instance; 

    public function CI_Base() 
    { 
     self::$instance =& $this; 
    } 

    public static function &get_instance() 
    { 
     return self::$instance; 
    } 
} 

function &get_instance() { 
    return CI_Base::get_instance(); 
} 

class Foo { 
    function run() { 
     $CI = & get_instance(); 
     $CI->username = "test"; 
     $db = new DB; 
     $db->connect(); 
    } 
} 

class DB extends Foo { 
    function connect() { 
     $CI = & get_instance(); 
     echo $CI->username; 
    } 
} 

$foo = new Foo; 
$foo->run(); 
+3

Singleton est un [motif] (http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29), pas une méthode. [Et vous devriez l'éviter] (http://stackoverflow.com/questions/1996230/how-bad-are-singletons). – Gordon

Répondre

1

Cela devrait fonctionner

class Foo { 
    function __get($field) { 
    if ($field == "username") { 
     //don't need to create get_instance function 
     $CI = CI_Base::get_instance(); 
     return $CI->username; 
    } 
    } 
} 

vous pouvez passer tous les accès aux champs non existants de Foo $ instance d'objet:

class Foo { 
    function __get($field) { 
     $CI = CI_Base::get_instance(); 
     return $CI->$field; 
    } 
} 

 

class DB extends Foo { 
    function connect() { 
     // this->username will call __get magic function from base class 
     echo this->username; 
    } 
} 

en php5 tu n'as pas besoin mettre l'esperluette avant get_instance car tous les objets sont passés par référence.

+1

Sans vouloir vous offenser, l'OP l'a demandé, mais j'ai pitié du pauvre garçon qui doit maintenir, tester et déboguer ce cauchemar. – Gordon