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 :

passage d'argument objet aux méthodes [POO]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut passage d'argument objet aux méthodes
    Bonjour,

    je viens d'attaquer une 2e lecture du bouquin de Bersini sur la POO...et je me suis arrêté sur un exemple de code PHP qui me surprend un peu...

    Code php : 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
    42
    43
    44
    45
    <html>
        <head>
            <title>test</title>
     
        </head>
    <body>
    <?php
    class O3 {
        private $c;
     
        public function __construct($initC){
            $this->c = $initC;
        }
     
        public function incrementeC(){
            $this->c++;
        }
     
        public function afficheC(){
            print("C=$this->c<br/>");
        }
    }
     
    class O2 {
        public function jeTravaillePourO2(O3 $lienO3){
            $lienO3->incrementeC();
            $lienO3->afficheC();
        }
     
        public function jeCreeUnObjet03(O3 &$lienO3) { /* avec ou sans le & */
            $lienO3 = new O3(7);
            $lienO3->incrementeC();
            $lienO3->afficheC();
        }
    }
     
    $unO3 = new O3(6);
    $unO2 = new O2();
    $unO2->jeTravaillePourO2($unO3);
    $unO3->afficheC();
    $unO2->jeCreeUnObjet03($unO3);
    $unO3->afficheC();
    ?>
    </body>
    </html>

    donc dans ce code, la classe O2 comporte 2 méthodes :
    - jeTravaillePourO2 à qui on passe une objet instance de la classe O3
    - jeCreeUnObjet03 à qui on passe en argument le même objet.

    D'après ce que j'ai compris, les objets sont automatiquement passés par référence, donc c'est le cas pour les 2 méthodes.
    Cela explique l'affichage obtenu :
    C=7
    C=7
    C=8
    C=8
    Mais de ce fait, le new de la ligne 31 provoque la création d'un nouvel objet instance de la classe O3, mais il ne sert pas à grand chose, vu que si on l'enlève, on obtient le même affichage (essai effectué). Qu'en pensez-vous ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut
    Citation Envoyé par laurentSc Voir le message
    on obtient le même affichage (essai effectué).
    T'es sûr de toi ? Parce que chez moi je n'obtiens pas le même résultat :
    avec le & de public function jeCreeUnObjet03(O3 &$lienO3) c'est
    C=7
    C=7
    C=8
    C=8
    Sans le &, c'est :
    C=7
    C=7
    C=8
    C=7
    Quand on dit que les instances de classes sont passées par référence, cela veut juste dire que la fonction continue de manipuler l'instance de classe en paramètre. Le code de la fonction impacte l'instance de la classe.
    Par contre le & précédent une variable a une importance dans la mesure où en plus de passer l'instance de la classe, la variable en paramètre passe également son adresse mémoire ce qui impacte les références externes de la variable.
    Je vais essayer de t'expliquer clairement ce qui se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function jeCreeUnObjet03(O3 $lienO3) { /* SANS LE & */
            $lienO3 = new O3(7);      // ICI TU CREES UNE NOUVELLE INSTANCE DE O3 A UNE ADRESSE MEMOIRE DIFFERENTE DE CELLE PASSEE PAR L'ARGUMENT $lienO3
            $lienO3->incrementeC();   // ici $c vaut 7 + 1 = 8
            $lienO3->afficheC();      // affiche : 8
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $unO3 = new O3(6);                // nouvelle instance de O3 : $c vaut 6
    $unO2 = new O2();
    $unO2->jeTravaillePourO2($unO3); // $c est incrémenté de 1 => $c vaut 7, affiche 7
    $unO3->afficheC();               // affiche 7
    $unO2->jeCreeUnObjet03($unO3);   // comme le code de la fonction travaille sur une nouvelle instance de O3 décorrelée de l'adresse mémoire initiale définie à la ligne 1, le code affiche 8 mais NE MODIFIE PAS L'INSTANCE INITIALE
    $unO3->afficheC();               // affiche 7, la valeur de $c n'a pas été modifiée par l'appel de la fonction sur la ligne précédente
    Ce n'est pas simple à expliquer dans la mesure où tu t'approches de la gestion mémoire et des pointeurs.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    Oui, je suis sûr de moi, et aussi sûr que tu n'as pas compris ce que je voulais dire ! En fait, il ne s'agissait pas d'enlever le & mais d'enlever le new...

    Donc d'accord avec ton explication, mais je reste sur ma position.

    Sinon, pour accepter ton explication, j'ai attrapé un sacré mal de tête...
    J'arrivais pas à comprendre pourquoi dans la ligne 6 de ton 2e code, on avait 7 et pas 8...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ben ça me paraissait évident la ligne 31 (avec ou sans c'est pareil), par contre les conséquences de la présence ou de l'absence du & dans le paramètre étaient autrement plus intéressantes.
    J'ai cru que tu butais sur cette esperluette. Je me suis dit, la vache, il avance vite le bougre
    Au temps pour moi

    PS: je ne te cache pas que parfois je ne vois pas du tout, mais alors pas du tout l'intérêt de certains exemples... Et ça dans un paquet de livres d'info.
    Ce n'est pas des exemples tangibles qui manquent, purée

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 723
    Points
    5 723
    Billets dans le blog
    1
    Par défaut
    heureusement pour esperluette. Pour moi, juste e commercial. Ayant codé en C (dans les années 90), les pointeurs, je connais...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. [MySQL] Passage d'arguments avec la méthode GET
    Par stefanelle dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/02/2009, 00h23
  2. Réponses: 3
    Dernier message: 08/02/2007, 14h20
  3. Réponses: 7
    Dernier message: 08/06/2006, 15h26
  4. [VBA-E] passage d'argument avec la méthode "Show"
    Par JOUBERT dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/03/2006, 14h56
  5. Méthode avec argument objet de la même classe
    Par Black-Ghost dans le forum C++
    Réponses: 5
    Dernier message: 30/01/2006, 11h01

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