IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Récupérer une instance de classe


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut [POO] Récupérer une instance de classe
    Bonjour,

    J'ai une classe "User" qui contient différentes informations : un User peut avoir un Email, un Password, etc.

    Voici mon souci ... Dans différentes classes de mon projet, j'aimerai pouvoir vérifier si il existe déjà "quelque part" une instance de cette classe Objet.

    De cette manière, si une instance existe déjà, je peux réutiliser cet objet et les infos présentes dans celui-ci et si pas, je peux créer une nouvelle instance.

    Est-ce possible ?

    Merci,
    Olivier

  2. #2
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Dans différentes classes de mon projet
    A ma connaissance (qui est limitée dans ce domaine), je ne pense pas que tu puisse avoir accés à une instance d'une autre class depuis celle ou tu te trouve. Sauf bien sur si il y a héritage. A confirmer.
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    Salut,

    J'ai trouvé une autre solution, détournée ...

    C'est basé sur la doc PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static function getUserInstance() 
        {
            if (!isset(self::$userInstance)) {
                $class = __CLASS__;
                self::$userInstance = new $class;
            }
     
            return self::$userInstance;
        }
    Ca permet de ne travailler qu'avec une seule instance de la classe

  4. #4
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Ouff, un peu indigeste pour moi. Peux tu m'indiquer ou tu as trouvé ces infos dans le manuel ? ceci me fera le plus grand bien de le bosser un peu
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    C'est possible si tu conserves un "tableau" (ou plus généralement une collection) des objets créés à un endroit accessible par tous.

    Je n'ai jamais eu de tels besoins en php. Mais une solution serait par exemple de créer une variable statique "userList" dans la classe "User" qui contiendrait un tableau associatif avec comme clé un identifiant de tes user et comme valeur l'objet créé.

    Il y a sûrement un design pattern qui correspond à ce besoin, mais je ne connais que les plus utilisés

    On peut s'inspirer par exemple du design pattern singleton pour ça, en remplaçant l'instance stockée par un tableau d'objets, et en ajoutant un paramètre à la méthode habituelle getInstance() du singleton. Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
    class User
    {
      protected static $_userList = array();
     
      public static function getUser($id)
      {
        if ( ! isset(self::$_userList[$id]))
        {
          self::$_userList[$id] = new User($id);
        }
        return self::$_userList[$id];
      }
     
      private function __construct($id)
      {
        // construction de l'objet, appelée obligatoirement via getUser()
      }
     
      // empêche de recréer un objet par clonage
      private function __clone()
      {
      }
    }
    De cette façon, pour créer ou récupérer un objet de la classe User, on est obligé de passer par User::getUser($id), et on ne créera pas d'objets en double...

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par oranocha Voir le message
    Salut,

    J'ai trouvé une autre solution, détournée ...

    C'est basé sur la doc PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static function getUserInstance() 
        {
            if (!isset(self::$userInstance)) {
                $class = __CLASS__;
                self::$userInstance = new $class;
            }
     
            return self::$userInstance;
        }
    Ca permet de ne travailler qu'avec une seule instance de la classe
    Ca c'est un début d'implémentation du pattern singleton dont je parlais dans mon message précédent (trop long à écrire ). Mais ça ne doit pas répondre à ta problématique, puisque ça ne permet pas de créer deux instances de la classe User, ou alors j'ai mal compris ton besoin ?

    Pour riete, des explications dans le tutoriel sur les design pattern :
    http://g-rossolini.developpez.com/tu...sign-patterns/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 80
    Points
    80
    Par défaut
    Merci de toutes ces infos qui me permettront d'améliorer mon appli plus tard lorsque j'aurai réussi à trouver une solution à mon autre problème :-) (PUT en CURL)

  8. #8
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Merci pour le lien Eusebe, je vais essayer de m'améliorer en lisant ce Tuto.

    Mais j'ai une question qui va sembler peut être un peu simpliste mais je la pose quand même.
    Dans le code que tu propose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class User
    {
      protected static $_userList = array();
     
      public static function getUser($id)
      {
        if ( ! isset(self::$_userList[$id]))
        {
          self::$_userList[$id] = new User($id);
        }
        return self::$_userList[$id];
      }
     
      private function __construct($id)
      {
        // construction de l'objet, appelée obligatoirement via getUser()
      }
     
      // empêche de recréer un objet par clonage
      private function __clone()
      {
      }
    }
    Rien n'empêche d'écrire ceci me semble t il ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    User1 = new User();
    User2 = new User();
    Etant donné que le constructeur n'est pas appelé de façon conditionnelle depuis la fonction getUser($id).
    Je dis peut être une annerie, mais tant pis, c'est comme cela que l'on apprends.
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Dans le code donné, le constructeur est privé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private function __construct($id)
    Il ne peut donc être appelé que par la classe User ou une instance de la classe User.

    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    User1 = new User();
    User2 = new User();
    tu auras une belle erreur php

  10. #10
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Merci pour la leçon. J'ai compris ma méprise, mais ceci peut effectivement être intéressant pour traiter certaines situations.

    Le chemin de la connaissance est sans limite

    A+
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 21/08/2009, 10h44
  2. [POO] Passage d'une instance de classe à un thread
    Par jesus144 dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2008, 12h19
  3. Réponses: 2
    Dernier message: 17/03/2008, 10h58
  4. Réponses: 4
    Dernier message: 27/07/2007, 20h34
  5. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo