|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : juillet 2003 Messages : 166 ![]() |
Hello
j'ai des difficultés à utiliser la méthode clone... mon but est de dupliquer un objet "full" , dupliquer aussi tous les objets qu'il contient, et encore chaque sous objet, et sous sous objet... j'y arrive en faisant un serialize/ unserialize, mais je pense que c'est peut être un goulot d'étranglement. J'ai vu qu'il y avait une méthode clone...mais je ne comprends pas comment elle marche. Code :
merci |
||
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Il faut utiliser la methode magic __clone.
Voici un exemple de code qui marche. Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : janvier 2007 Messages : 1 452 ![]() |
En complément je dirais que la méthode __clone qui est défnis dans tes classes est la méthode qui est appelée par PHP lorsque tu appelles la fonction clone ainsi :
clone($toto); ou $toto est une instance d'une classe. Si tu ne définis pas cette méthode, j'imagine que PHP clone l'objet sans cloner les objets à l'intérieur, et fais donc des références. tu fera attention, on parle bien de la méthode __clone et de la fonction clone, qui sont toutes deux différentes. voiilà, simple précision. bye |
|
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() Inscription : juillet 2003 Messages : 166 ![]() |
ok
juste un précision : si je comprends bien je dois aussi définir __clone dans piece pour tous ses objets, et ainsi de suite ? sinon j'avoue j'ai du mal à comprendre le code là Code :
par le nouvel objet ? ou l'ancien ? enfin si je compare à c++ les constructeurs de recopie tout ça, ben il manque un parametre là, non ? quel est le nouvel objet, quel est "la source" ? je ne comprends pas cette ligne par exemple $this ->pieces[$i] = clone $this ->pieces[$i]; merci |
||
|
|
00
|
|
|
#5 | ||||||
|
Membre Expert
![]() Inscription : janvier 2007 Messages : 1 452 ![]() |
Citation:
Citation:
Citation:
Citation:
Code :
en espérant que cela t'aides à saisir. bye |
||||||
|
|
00
|
|
|
#6 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Les methodes *magic* de php pour les objets sont des methodes dont normalement tu n'as pas à faire l'appel directement.
Elles reagissent à des evenements. Voici quelques exemples : __construct : methode appellé a la creation d'un objet __get : methode appellé quand on effectue un appel à un attribut inexistant. $objet ->mavariable (sauf que mavariable n'existe pas) __set : methode appellé quand on effectue une assignation de valeur à un attribut indexistant ($objet -> mavariable = 1) __clone : methode appellé lors du clonage et indiquant les actions specifiques à effectuer en plus du clonage de l'objet (par exemple, cloner tous les attributs si ce sont des objets, tu peux utiliser l'API de reflexion de PHP pour faire ça.) |
|
|
00
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : juillet 2003 Messages : 166 ![]() |
je voulais dire :
pour cloner un objet j'aurai eu tendance à écrire ça Code :
public function __clone() { $size = count($this -> pieces); for($i=0; $i<$size; $i++){ $this ->pieces[$i] = clone $this ->pieces[$i]; } } dans ce cas le this signifie le nouvel objet et dans celui là l'ancien ? Comment on s'en sort ? je ne comprends pas [Edit :] ok je crois que je viens de comprendre le mécanisme.... en fait 1) l'objet est cloné automatiquement par php 2) la méthode __clone est appelée sur le nouvel objet, et "this" reference le nouvel objet 3) on boucle sur ce qu'on a, qui est donc ce que l'autre objet avait, car ça a déjà copié et on modifie ce qu'on a, en faisant pointer ailleurs, "ailleurs" étant, une copie de l'objet que l'on fabrique à la volée |
||
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Inscription : janvier 2007 Messages : 1 452 ![]() |
Hm bien vu. Et sa explique mieu tes interrogations.
bref : Code :
|
||
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Inscription : juillet 2003 Messages : 166 ![]() |
aïe, c'est contradictoire avec ce que je viens de déduire
il faut un arbitre ^^ clone est censé faire un return ou pas ? |
|
|
00
|
|
|
#10 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Tu viens de mettre la main dans l'engrenage des methodes magic de PHP...
Elles sont assez mal défini ^^ et surtout, on sait pas ce qu'il y'a derriere ... (La documentation est tres tres light à leur sujet) Personnellement, j'en sais rien. A dire vrai, je clone tres rarement mes objets et dans tous les cas, j'ai jamais eu à cloner un objet composé d'autres objets. Neanmoins, si tu fais des tests, les resultats m'interessent |
|
|
00
|
|
|
#11 | ||||
|
Membre Expert
![]() Inscription : janvier 2007 Messages : 1 452 ![]() |
Hm, bon après quelques test je me rends compte que j'ai dit des bétises....
Mais la doc est quand même sacrément mal faites. Bref, un petit script pour comprendre. Code :
Code :
Tout cela me fait dire qu'en fait, cette méthode est à priori relativement useless de mon point de vue. bye et désolé pour les boulettes :s Quoique thread tout de même interessant pour le point soulevé |
||||
|
|
00
|
|
|
#12 | |||||
|
Membre du Club
![]() Inscription : juillet 2003 Messages : 166 ![]() |
bon j'ai réussi à faire,
c'est bien comme ça que ça se passe Citation:
Code :
Code :
|
|||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com