2010-12-04 2 views
0

Par exemple, mon application utilise l'instance d'un objet Utilisateur et différents autres objets doivent accéder à certains attributs et méthodes. Et ces objets instancient d'autres objets, qui à leur tour doivent également accéder à l'utilisateur. Quelle est la meilleure façon de gérer cela? Passer l'objet utilisateur comme référence lorsque j'instancie ces nouveaux objets?PHP: Si de nombreux objets utilisent l'instance du même objet, quelle est la manière efficace de la passer?

est ici par exemple de la façon dont cela se fait maintenant:

 
class App { 
    private $user; 
    private $controller; 

    public function __construct() { 
    $this->user = new User(); 
    $this->controller = new Controller(); 
    $this->controller->setUser(& $this->user); 
    } 
} 

Est-ce la bonne façon de le faire?

EDIT: Existe-t-il un moyen de faire de l'instance utilisateur une variable globale?

+0

passe des objets en PHP5 référence par défaut, donc ne pas besoin de le faire explicitement –

+0

Regardez le motif Singleton. Peut-être que ça va mieux ici. – KingCrunch

+0

@Paul, ce n'est pas tout à fait vrai. Il passe un handle par valeur. Mais votre conseil est toujours correct ... laissez tomber le '&' dans l'appel de la fonction. – Matthew

Répondre

1

Existe-t-il un moyen de faire de l'instance utilisateur une variable globale?

Il ressemble à un singleton serait utile:

class User 
{ 
    private static $instance; 

    private function __construct() { } 

    public function instance() 
    { 
    return self::$instance ? self::$instance : (self::$instance = new self()); 
    } 
} 

$user = User::instance(); 

Fondamentalement, tout ce qui a besoin de l'utilisateur peut simplement appeler User::instance() au lieu de new User(). Ils fonctionneront tous sur la même instance de l'objet, donc ceci n'est applicable que de l'objet User qui représente les mêmes données pendant toute la durée du script.

Mise à jour

votre commentaire « Non, il est possible pour un utilisateur d'effectuer des actions sur un autre utilisateur », alors ce modèle n'est pas applicable pour chaque utilisation.

On dirait que vous avez juste besoin de passer l'objet $user à toute personne qui en a besoin. (Bien sûr, vous pouvez toujours utiliser un singleton pour représenter l'utilisateur authentifié.)

+0

Que faire si j'ai besoin d'une instance pour un autre utilisateur? Dans le cas où le visiteur (qui est instancié en tant qu'utilisateur) doit effectuer une action impliquant des données d'un autre utilisateur? –

+0

Vous pouvez passer un paramètre à 'instance()' et mettre en cache les données. – Matthew

+0

Eh bien, je suppose que la question est de savoir si techniquement je peux utiliser la même classe pour utiliser à la fois comme singleton et d'instancier via __construct pour les autres utilisateurs? –

2

Juste pour faire ma suggestion dans les commentaires à une réponse

Vous pouvez mettre en œuvre le modèle singleton

class User { 
    protected static $instance = null; 
    protected function __construct() { /* disable external instanciation */ } 
    private function __clone() { /* disable clone */ } 
    public static function getInstance() { 
     if (is_null(self::$instance)) { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 
} 

ici est quelque chose à lire :)

http://en.wikipedia.org/wiki/Singleton_pattern

Questions connexes