2010-01-16 4 views
2

Je travaille sur certaines classes PHP, j'ai une classe de session utilisée pour définir et obtenir des valeurs aux variables de session, je besoin d'avoir accès à cet objet de classe de session dans toutes les autres classes, donc je fait une méthode singleton dans la classe de la session puis dans d'autres méthodes de classe, je peux appeler l'objet de session comme celui-ci ....Ai-je besoin de saisir un objet de classe PHP dans chaque méthode dans une classe?

$session = Session::getInstance(); 

cela renverra l'objet de session pour moi d'utiliser ou bien commencer un nouvel objet de la session si l'on n'a pas encore démarré. Donc, ma question, si j'ai une classe d'utilisateurs et une classe de base de données et chaque classe avait 10 méthodes dans chaque qui doit accéder à l'objet de session, alors je devrais exécuter le code ci-dessus dans chaque méthode ou juste 1 fois dans la classe et alors toutes les méthodes l'auraient? Je suis nouveau à ceci donc je ne suis pas sûr ??? Merci

+1

C'est exactement pourquoi nous continuons à vous dire d'utiliser un conteneur de service d'injection de dépendance :) Encore une fois, voir http://www.slideshare.net/fabpot/dependency-injection-with-php-and-php-53 – Gordon

+0

@Gordan , parfois il me faut un certain temps pour "obtenir" des choses, ce diaporama est utile pour moi maintenant, merci – JasonDavis

Répondre

2

Dans un modèle Singleton, vous auriez en effet de le faire.

Une alternative pourrait être d'ajouter l'objet de session en tant que membre protégé $session de votre classe dans le constructeur, puis y accéder à partir de chaque méthode que $this->session.

Si vous voulez lire une discussion plus large sur la façon d'organiser et d'utiliser les objets d'aide et de bibliothèque en PHP, j'ai demandé une fois related SO question qui a donné des réponses intéressantes.

+0

Merci qui pourrait être une bonne solution au lieu de répéter le même code encore et encore, j'accéderais alors à la fonction ou variable du objet de session comme ceci, $ this-> session-> get() ou comme ce $ session-> get() ou d'une autre manière? merci – JasonDavis

+0

'$ this-> session-> get()' c'est. @Pikrass a un exemple complet dans sa réponse. –

+0

très cool, merci – JasonDavis

1

Exécutez votre méthode dans le constructeur de chaque classe et stocker l'objet résultant comme une variable d'instance. Ensuite, vous pouvez accéder à votre instance de Session dans les méthodes avec $ this-> session. Vous pouvez ensuite accéder à votre instance de Session dans la méthode $ this-> session.

+0

merci bon exemple – JasonDavis

-1

Sinon, vous pouvez faire cette $session une variable globale.

$GLOBALS["session"] = Session::getInstance(); 

Vous pouvez ensuite manipuler $GLOBALS["session"] de n'importe où.

Mais si vous voulez que votre code pour mesurer à la discipline idéalisée de la POO, le bâton avec la réponse de Pekka :)

1

Vous voulez mettre votre session dans votre constructeur. Pour plus de flexibilité cependant, il peut être préférable de passer l'objet de session:

class User { 

    private $session; 

    public function __construct(Session $session) { 
    $this->session = $session; 
    } 

    public function methodOne() { 
    $stuff = $this->session->getStuff(); 
    // etc... 
    } 

} 

// example usage 
$session = Session::getInstance(); 
$user = new User($session); 
$user->methodOne(); 

Cette méthode permet de garantir que votre objet utilisateur n'est pas lié à la mise en œuvre de cette session spécifique. Tant que les autres objets de session ont la même interface, votre objet Utilisateur peut heureusement utiliser n'importe quel objet sans problème.

// example usage 
$session = SuperSession::getInstance(); // SuperSession is like Session, 
             // but better! same interface though. 
$user = new User($session); 
$user->methodOne(); 
1

Parce que les objets gère PHP par référence, vous pourriez techniquement avoir une classe de base qui capture une instance de la session dans le constructeur

abstract class AbstractSessionEnabledClass { 

    public function __constructor() { 
     $this->session = Session::getInstance(); 
    } 

    private $session = null; 
} 

Et puis ont vos sous-classes étendent cette classe

class SomeClass extends AbstractSessionEnabledClass { 
    public function __constructor() { 
     parent::__constrcutor(); //this isn't needed if this class has no constructor 
    } 

    public function someMethod() { 
     var_dump($this->session) 
    } 
} 

Ce type d'encapsulation sera effectivement rendre votre code plus facile à modifier dans le cas où la gestion des sessions change jamais.

Questions connexes