2009-12-03 2 views
0

Je suis en train de programmer un backend de site web en PHP et j'ai besoin d'encapsuler $ _SESSION dans une classe. J'ai fait de ma classe Session un singleton mais j'ai du mal à l'utiliser.Objet PHP Singleton ne fonctionne pas

class Session 
{ 

    private static $instance; 

    public static $sessionID; 

     private function __construct() 
     { 
      session_start(); 
      self::$sessionID = session_id(); 
     } 

     public function Session() { 
      return Session::singleton(); 
     } 

     public static function singleton() 
     { 
      if (!isset(Session::$instance)) { 
       Session::$instance = new Session(); 
      } 

      return Session::$instance; 
     } 

     public function destroy() 
     { 
      foreach ($_SESSION as $var => $val) { 
       $_SESSION[$var] = null; 
      } 

      session_destroy(); 
     } 

     public function __clone() 
     { 
      trigger_error('Clone is not allowed for '.__CLASS__,E_USER_ERROR); 
     } 

     public function __get($var) 
     { 
      return $_SESSION[$var]; 
     } 

     public function __set($var,$val) 
     { 
      return ($_SESSION[$var] = $val); 
     } 

     public function __destruct() 
     { 
      session_write_close(); 
     } 

     public function exist($var) { 
     return isset($_SESSION[ $var ]); 
     } 

} 

Fonctionne correctement 95% du temps. Mais quand j'invoque occasionnellement var_dump(Session::singleton());

sortie: object(Session)#2 (0) { }

Il me semble évident qu'il fait une autre instance de ma classe de session, mais je ne vois pas exactement comment il est possible.

Merci beaucoup!

Répondre

2

Essayez de retirer le constructeur public (ne laissant que le privé)

public function Session() { 
     return Session::singleton(); 
    } 

Je ne suis pas sûr à 100% qui va le faire, mais d'avoir un constructeur public ne respecte pas le modèle Singleton

+0

Oui, il n'y a aucune raison que cela soit là. Le code n'est pas compatible avec PHP4 donc il n'y a aucune raison d'avoir un constructeur de style PHP4. –

+0

Merci, je vais l'enlever mais c'est là seulement pour raison de fixation. Un autre site a suggéré d'écrire pour résoudre le problème. Le problème est toujours là. – Duguigne

1

Le '# 2' (après 'object (Session)') n'est pas le numéro de l'instance de la classe Session mais le numéro suivant de l'objet créé par php. Si vous obtenez # 2, il semble que vous avez créé quelque chose (objet) avant. J'ai testé votre classe et quand j'ai lancé "var_dump (Session :: singleton());" J'obtiens: "object (Session) # 1 (0) {}" mais quand je l'exécute à la fin du script je reçois (par exemple): "object (Session) # 31 (0) {}"

Cordialement