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] Classes qui s'incluent elles même de manière récursive


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut [POO] Classes qui s'incluent elles même de manière récursive
    Bonjour à tous,

    Dans un projet que je réalise en ce moment, j'aurais besoin de vos lumières.

    Je voudrais savoir s'il est possible de déclarer une classe et quelle puisse s'instancier elle meme.

    Je m'explique par un exemple pour lever certaines ambiguités de langage:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $toto = new classeA(); //En instanciant une classe déclarée auparavant
     
    $toto->methodeX(); // Je peux appeler la méthode methodeX définie à l'intérieur (pas de pb jusque la)
     
    $toto->methodeY->methodeX(); //Je voudrais pouvoir faire ceci
    // où methodeY serait une nouvelle instanciation de classeA
    Je ne vois pas comment réaliser ceci et je ne sais pas comment nommer ce que je souhaite. Aucune de mes recherches n'a aboutie. Je me tourne donc vers ce forum.
    Peut-etre que vous appelez ca instanciation récursive ?

    En vous remerciant pour vos réponses

  2. #2
    Membre habitué
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 199
    Points
    199
    Par défaut
    Dans le constructeur de classeA(), mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->methodeY = new classeA();
    Quand tu dis "nouvelle isntanciation", c'est bien un 2ème objet que tu veux ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    merci pour la rapidité.
    Ce que tu me répond correspondrait exactement. Cependant, j'avais essayé ce qui donnait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ClasseA {
     var X;
     var Y;
     
     function ClasseA() { //Constructeur
      $this->X = null;
      $this->Y = new ClassA();
     }
    }
    mais cela fait planter le serveur dès l'instanciation.Normal vu qu'il ne va pas arreter de se déclarer.

    Je pense avoir trouvé un moyen en faisant:

    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
    class ClasseA {
     var X;
     var Y;
     
     function ClasseA() {
      $this->X = 3;
      $this->Y = null;
     }
     
     function Prepare() {
      $this->Y = new ClasseA();
     }
    }
     
    //Utilisation
    $toto = new ClasseA();
    $toto->prepare();
    $toto->Y->X +=1;
    echo $toto->Y->X; //donne 4
     
    $toto->Y->prepare();
    echo $toto->Y->Y->X; //donne 3
     
    //et ainsi de suite ...
    Y'aurait-il plus simple ? (sans passer par une méthode "prepare", cad à la déclaration)

  4. #4
    Membre habitué
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 199
    Points
    199
    Par défaut
    Hum... Non, pas mieux, à part éventuellement en passant par __get(), mais c'est pas super joli ni très rapide et j'apparente ça a de la bidouille...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par savageman86 Voir le message
    Hum... Non, pas mieux, à part éventuellement en passant par __get(), mais c'est pas super joli ni très rapide et j'apparente ça a de la bidouille...
    Salut,

    Php n'offre pas mieu à l'heure actuel. Et c'est une solution comme une autre qui fonctionne parfaitement, à mon sens cela n'est pas du tout de la bidouille. Mieux encore cela permet de faire du lazyloading de manière très élégante, en apparence.
    Ce sera de toute manière une solution à tout point de vue plus optimum que d'utiliser le constructeur pour instancier Y

    Bref il n'y à pas le choix gnarkk, soit tu utilises __get, soit tu crées une méthode, mais tu ne feras pas l'instanciation dans le constructeur.
    Cependant __get n'est disponible qu'à partir de PHP5, donc ce n'est pas pour toi :\ Puisque tu utilises PHP4.

    Sinon on peut légérement modifier ton code ainsi :
    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
    25
    class ClasseA {
     var X;
     var Y;
     
     function ClasseA() {
      $this->X = 3;
      $this->Y = null;
     }
     
     function Prepare() {
    if( $this->Y == NULL )
      $this->Y = new ClasseA();
    return $this->Y;
     }
    }
     
    //Utilisation
    $toto = new ClasseA();
    $toto->prepare()->X +=1;
    echo $toto->Y->X; //donne 4
     
    $toto->Y->prepare();
    echo $toto->prepare()->Y->X; //donne 3
     
    //et ainsi de suite ...
    bye

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos lumières

Discussions similaires

  1. Réponses: 11
    Dernier message: 25/07/2012, 18h56
  2. Réponses: 9
    Dernier message: 28/12/2011, 12h16
  3. [Entité-Association] Table qui se référence elle-même ou simplicité ?
    Par Invité dans le forum Schéma
    Réponses: 15
    Dernier message: 15/10/2008, 10h27
  4. JFrame qui se superpose à elle-même
    Par Grulf dans le forum Agents de placement/Fenêtres
    Réponses: 37
    Dernier message: 18/06/2008, 16h40
  5. Une iframe qui se supprime elle-même
    Par jibouze dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/12/2005, 10h11

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