2009-09-22 7 views
0

Voici un exemple très simple des problèmes que j'ai. Maintenant pourquoi utiliser $ session = new Session(); dans le fichier database.class.php lorsque les fichiers sont inclus dans mon système de manière à ce qu'ils soient déjà visibles. En d'autres termes, je ne peux pas appeler $ session = new Session(); en dehors de toutes les autres classes, pour le faire fonctionner dans d'autres classes que je dois appeler créer un nouvel objectof la classe de session dans chaque classe que je veux l'utiliser, comment puis-je éviter cela et le faire fonctionner sans faire cela?Problèmes relatifs à la portée de la classe PHP

// Session.class.php 
class Session{ 

    public function __construct() 
    { 
     session_start(); 
    } 

    public function set($name, $value) 
    { 
     $_SESSION[$name] = $value; 
    } 
} 

...

// Database.class.php 
class Database{ 

    public static function mysql_query_2($query) 
    { 
     if ($session->get('user_role') == 10){ 
      $_SESSION['queries']++; 
     } 
     return mysql_query($query); 
    } 
} 
+1

Je ne vois pas '$ session = new Session();' dans le code fourni n'importe où. Cela pourrait nous aider à comprendre votre problème. – MitMaro

+0

@MitMaro désolé, la classe est démarrée ailleurs dans le script, je ne veux que le démarrer 1 fois et de cette façon il me demande maintenant de le démarrer dans chaque fichier de classe qui utilise une classe d'un autre fichier – JasonDavis

Répondre

1

Si je comprends bien votre problème, une solution à votre problème est d'utiliser un Singleton .

final class Singleton { 

    protected static $_instance; 

    // Singleton can't be constructed or cloned 
    protected function __construct(){ } 
    protected function __clone() { } 

    // Create an instance if necessary and return an instance. 
    public static function getInstance(){ 
     if(self::$_instance === NULL) { 
     session_start(); 
     self::$_instance = new self(); 
     } 
     return self::$_instance; 
    } 

    public function set($name, $value){ 
     $_SESSION[$name] = $value; 
    } 
} 

Dans index.php vous auriez:

$session = Session::getInstance(); 
$session->get(); 

Ensuite, dans votre classe de base de données vous auriez:

// Database.class.php 
class Database{ 

    public static function mysql_query_2($query) 
    { 
     if (Session::getInstance()->get('user_role') == 10){ 
       $_SESSION['queries']++; 
     } 
     return mysql_query($query); 
    } 
} 

Vous ne jamais créer une instance de la classe de session (qui est ce que je pense que tu cherches). Ensuite, lorsque vous avez besoin de la classe Session ailleurs (c'est-à-dire votre classe Database), vous appelez à nouveau . Il n'y a qu'une seule instance de Session créée et vous pouvez l'utiliser globalement dans votre script.

+0

merci pour le code, c'est probablement la seule solution mais je demanderai de toute façon, est-il possible d'appeler quelque chose comme $ session = new $ session(); dans un fichier index.php par exemple, puis être en mesure d'utiliser ses méthodes dans d'autres classes ou tout autre fichier inclus dans le fichier d'index sans créer fondamentalement une nouvelle instance dans chaque fichier? – JasonDavis

+0

J'ai mis à jour ma réponse mais elle ne répond pas vraiment à votre question ici. Vous pouvez utiliser le $ GLOBALS [http://us2.php.net/manual/en/reserved.variables.globals.php] mais un Singleton est beaucoup mieux. – MitMaro

+0

Je comprends la chose singleton maintenant mais j'ai toujours les mêmes erreurs, fondamentalement j'obtiens des erreurs si je n'initie pas la classe sur chaque page physique dont j'ai besoin pour l'employer ainsi mon problème est plutôt le contraire d'un singleton, au lieu d'avoir besoin la classe pour commencer 1 fois j'ai besoin de le démarrer dans chaque fichier que j'inclus dans une page qui a besoin d'utiliser les méthodes de la classe. J'espère que j'ai du sens, ça me rend fou d'essayer de savoir pourquoi je dois l'initier sur tous les dossiers. S'il y a un index.php et un test1.php, test2.php, test3.php tous les 3 inclus dans le fichier index.php, pour éviter une erreur – JasonDavis

2

D'abord et avant tout, votre classe de session devrait être un singleton - la raison est que plusieurs appels à session_start() vous obtiendrez rien mais des problèmes (ID de session se régénère)

Alors ...

/** 
* Session singleton class 
*/ 
class Session 
{ 
    // prevents object instanciation ($obj = new Session()) 
    protected function __construct() { 
     session_start(); 
    } 

    // prevents object cloning 
    protected function __clone() {} 

    public static function getInstance() 
    { 
     static $instance = null; 
     if ($instance == null) 
      $instance = new Session(); 
     return $instance; 
    } 

    // rest of the code 
} 

Pour l'utiliser, vous appelez simplement:

$sess = Session::getInstance(); 
$sess->doSomething(); 

ou simplement

Session::getInstance()->doSomething(); 

Ne importe où vous devez utiliser la classe de session.

Mise à jour: - Je vois que vous probablement ne saisissent pas le concept de singletons encore, voici donc un bon wikipedia link 8)

+0

Vous battez moi et vous avez donné un exemple. +1 – MitMaro

+0

Vous avez cependant quelques erreurs dans votre singleton, vous ne renvoyez pas l'instance. – MitMaro

+0

oui, c'est fixe - temps de café je suppose 8) –

Questions connexes