Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/08/2008, 13h42   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
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 :
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:
Citation:
__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 :
1
2
3
4
 
$a = serialize($a);
 
$b->func($a);
et le résultat:
Citation:
__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
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 17h12   #2
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
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:
Citation:
__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é.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 17h23   #3
Membre confirmé
 
Inscription : juillet 2008
Messages : 145
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 145
Points : 260
Points : 260
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.
bredelet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 17h47   #4
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
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
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 18h26   #5
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
Merci pour vos réponses
Cela veut donc dire que $a est détruit la 1ere fois
lors de sa serialization:
Code :
1
2
 
$a = serialize($a);
puis reconstruit dans la méthode func:
Code :
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 :
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 ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 19h01   #6
Membre confirmé
 
Inscription : juillet 2008
Messages : 145
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 145
Points : 260
Points : 260
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.
bredelet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2008, 20h06   #7
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 598
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 598
Points : 123
Points : 123
Ok, c'est plus clair maintenant.
Merci
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h07.


 
 
 
 
Partenaires

Hébergement Web