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] 2 Objets devraient pointer l'un vers l'autre


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 24
    Points
    24
    Par défaut [POO] 2 Objets devraient pointer l'un vers l'autre
    Bonjour, j'ai un problème un peu difficile à expliquer concernant les Objets en PHP 4.4. Je vais essayer d'être clair :

    2 objets de classe Module et SousModule ont chacun un attribut qui pointe vers l'autre objet.
    En sachant que l'objet de classe SousModule est créé dans la constructeur de l'objet Module.

    Je n'arrive pas à faire correctement pointer les 2 objets entre eux car :
    Quand je modifie directement un attribut de l'objet Module, le SousModule ne voit pas cette modification via son attribut qui pointe vers Module.
    Il y a surement eu une copie d'un objet quelque part, mais je ne sais pas où.


    J'ai mis en valeur mon problème avec ce code :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
     
    class Module {
        var $id;
        var $val;
        var $SousModule;
     
        function Module($id) {
            $this->id = $id;
            $this->SousModule = new SousModule($this);
        }
     
        function Display() {
            echo 'Module '.$this->id.' : val = '.$this->val.'<br/>';
        }
    }
     
    class SousModule {
        var $Module;
     
        function SousModule(&$Module) {
            $this->Module = &$Module;
        }
     
        function Display() {
            $this->Module->Display();
        }
    }
     
    // Construction du module (le sous module se crée automatiquement dans le constructeur)
    $Module = new Module(99);
     
    // Modification de l'attribut val
    $Module->val = '5';
     
    // Affichage du module :  val = 5, ok
    $Module->Display();
     
    // Affichage du module via son sous-module : val != 5, pas ok
    $Module->SousModule->Display();
    ?>
    Les 2 instructions Display de la fin devraient afficher la même chose.

    Pouvez m'aider à réparer ce code ?

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Sans avoir trop le temps de lire et d'étudier ton cas, un conseil me vient : fais attention à ne pas confondre références et pointeurs

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    C'est vrai que le "référence" que j'ai écris est en trop. Je le supprime du message.

    En fait j'utilise un passage de paramètre par référence dans le constructeur du SousModule, pour lui transmettre le Module.
    C'est peut-être là qu'est le problème...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    essya avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->SousModule =& new SousModule($this);

  5. #5
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 87
    Points : 90
    Points
    90
    Par défaut
    C'est limite hors sujet mais bon...

    Je ne vois pas pourquoi tes objets et fonctions ont des majuscules... Normalement seuls les classes et constructeurs prennent une majuscule. Le problème ne vient sûrement pas de là, mais bon, ça falicitera la lecture, enfin je pense.

    Enfin ce sont les normes que j'utilise en Smalltalk et en Java.

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par jeff_!
    essya avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->SousModule =& new SousModule($this);
    Ca ne marche pas.

    Par contre avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Module = & new Module(99);
    Ca marche !

    Mais je ne comprends vraiment pas pourquoi.

    Quelqu'un peut m'expliquer pourquoi ?

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    Hum désole de remonter ce post, mais c'est pour une question claire maintenant :

    Quelle est la différence entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Module = new Module(99);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Module = & new Module(99);
    ?

    Merci.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    Code :
    $Module = new Module(99);
    ici on creer une copie objet

    Code :
    $Module = & new Module(99);

    et la on creer une reference

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    C'est quand même dingue que même avec un news on se retrouve avec une copie d'objet !
    L'objet est à peine créé qu'il subit déjà une copie...

    Enfin j'imagine que c'est la faute au =

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

Discussions similaires

  1. Faire pointer $this->url() vers un autre sous-domaine
    Par supertino7 dans le forum Zend Framework
    Réponses: 4
    Dernier message: 23/05/2010, 18h03
  2. [Toutes versions] Copie objet d'une base externe vers une autre base externe
    Par guen dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/10/2009, 10h35
  3. [Spip] Faire pointer une rubrique vers une autre page
    Par clgmoliere dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 15/12/2008, 12h04
  4. DNS : faire pointer un domaine vers un autre
    Par aurapp dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 01/06/2007, 16h38
  5. Réponses: 6
    Dernier message: 12/02/2004, 21h55

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