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] Passage d'objet en paramètre


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut [POO] Passage d'objet en paramètre
    Bonjour,

    Je m'initie aux classes sous PHP5 et j'avoue
    que je patauge un peu.
    En ce moment je cherche à savoir comment passer un objet de classe A
    en paramètre à une méthode de classe B.
    J'y suis plus ou moins arrivé mais certains résultats me laisse perplexe.
    Voici mon 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    class A
    {
      private $attr1;
     
      public function __construct()
      {
        $this->attr1 = 5;
        echo '__construct A<br />';
      }
     
      public function __destruct()
      {
        echo '__destruct A<br />';
      }
     
      public function add()
      {
        $this->attr1 = $this->attr1 + 2;
      }
     
      public function getAttr1()
      {
        return $this->attr1.'<br />';
      }
    }
     
     
     
    class B
    {
     
      public function __construct()
      {
        echo '__construct B<br />';
      }
     
      public function __destruct()
      {
        echo '__destruct B<br />';
      }
     
      public function func(&$o)
      {
        $o = unserialize($o);
        $o->add();
        echo $o->getAttr1();
      }
    }
     
     
    $a = new A();
     
    echo $a->getAttr1();
     
    $b = new B();
     
    $oa = serialize($a);
     
    $b->func($oa);
     
    echo $a->getAttr1();
     
    echo 'fin du script.<br />';
    et le résultat:
    __construct A
    5
    __construct B
    7
    5
    fin du script.
    __destruct A
    __destruct B
    __destruct A
    l'objet $a n'a pas été modifié, ce qui est logique puisque ce
    n'est pas lui qui est passé en paramètre mais sa copie serializée.

    Ce que je ne comprend pas c'est pourquoi il y a 2 appels au destructeur
    de A alors qu'il n'y a qu'une seule instanciation ?

    Dans le but de modifierl'objet lui-même j'ai modifié 2 lignes de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $a = serialize($a);
     
    $b->func($a);
    et le résultat:
    __construct A
    5
    __construct B
    __destruct A
    7
    7
    fin du script.
    __destruct B
    __destruct A
    l'objet $a est bien modifié, par contre le 1er appel au destructeur A
    se fait au niveau de serialize et non plus à la fin du script.
    Ceci dit je ne comprend toujours pas ces 2 appels au destructeur.

    Quelqu'un pourrait-il m'éclairer ?

    Merci

  2. #2
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Arf! Après plusieurs recherches je viens de m'apercevoir que je me suis emmêlé les pinceaux avec serialize et unserialize.
    En fait je n'ai pas besoin de ces fonctions pour ce que je veux faire.
    Il suffit simplement de passer l'objet en paramètre:
    et j'ai le résultat:
    __construct A
    5
    __construct B
    7
    7
    fin du script.
    __destruct B
    __destruct A
    qui est bien le résultat attendu.
    Note: en PHP5 les objets sont passés automatiquement par références, il
    n'est plus nécessaire de préfixer le paramètre avec & comme dans PHP4.

    Toutefois si quelqu'un pouvait m'expliquer pourquoi le destructeur est
    appelé 2 fois dans le code du 1er post je suis toujours intéressé.

  3. #3
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Tu as deux objets de type A dans ton script initial, $o et $a. C'est pourquoi le destructeur est appele deux fois.

    Le constructeur n'est pas appele pour $o car l'objet a ete cree avec unserialize, pas avec un constructeur.

  4. #4
    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
    Car lorsque tu le désérialise tu instancies implicitement un nouvel objet, enfin PHP le fait pour toi.
    Du coup à la fin du script, le GC va supprimer l'instance et appelé __destruct.

    Ce qu'il n'aurait pas fait si tu n'avais pas déserialisé l'objet.

    bye

  5. #5
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Merci pour vos réponses
    Cela veut donc dire que $a est détruit la 1ere fois
    lors de sa serialization:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $a = serialize($a);
    puis reconstruit dans la méthode func:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function func(&$o)
      {
        $o = unserialize($o);
        $o->add();
        echo $o->getAttr1();
      }
    où le constructeur de A n'est pas appelé parce qu'on utilise unserialize.
    Enfin le destructeur est rappelé une 2eme fois à la fin du script.

    mais ce que je ne comprend pas c'est pourquoi l'appel en fin
    de script reste valide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $a->getAttr1();
    puisque $a a été sérializé puis unserializé ailleurs dans une autre méthode,
    toutes invocation avec $a devrait provoquer une erreur non ?

  6. #6
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    L'objet n'est pas detruit lors de la serialisation. Tu peux toujours l'utiliser. C'est $o qui est detruit en premier, puisqu'il n'est plus accessible une fois que func termine.

  7. #7
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Ok, c'est plus clair maintenant.
    Merci

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

Discussions similaires

  1. [POO] Passage d'objet
    Par kyript dans le forum Langage
    Réponses: 10
    Dernier message: 16/05/2006, 19h42
  2. [POO] Passage d’objet en références
    Par remyli dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2006, 12h19
  3. [POO] Passage d'objet dans un formaulaire
    Par jiluc dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2005, 16h07
  4. [POO] passage nom objet dsn les parametres d'une fonction
    Par melou dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/10/2005, 17h26
  5. [DLL] Passage d'objet en paramètre
    Par TitiFr dans le forum Langage
    Réponses: 4
    Dernier message: 20/08/2005, 23h18

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