Bonjour,
J'ai voulu utiliser la fonction "clone" pour faire un "snapshot" de l'état d'un objet à un instant 't'.
Je me suis alors apperçu que les objets "clonés" continuent, après leur création, d'évoluer de manière analogue à l'objet avec lequel ils ont été clonés alors que je souhaitais les voir évoluer indépendamment.
Aussi, j'ai un problème de compréhension dans l'exemple ci-dessous dans la mesure où tous les objets ne sont "actifs" qu'après l'appel de la méthode "clone" alors qu'ils ont été créés avant (précédente itérration dans ma boucle). Je m'attendais donc à pouvoir faire appel à eux avant.
Mon code exemple :
Le résultat d'execution de ce code donne :
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 <?php class MyObj { var $int_VarTest=0; # variable incrémentale var $int_TempValue; # valeur en mémoire pour l'objet function TestClone_MyObj() { if($this->int_VarTest >= 2) { exit(); # permet de sortir de la boucle } $this->int_VarTest++; # Test d'existance des objets for ($i=1;$i<=$this->int_VarTest;$i++) { echo 'AVANT retour de is object() pour objet : ' . 'toto' . $i . ' = ' . is_object(${'toto' . $this->int_VarTest}) . '<br>'; //echo 'APRES obj toto' . $i . ', $int_TempValue = ' . ${'toto' . $this->int_VarTest}->int_TempValue . '<hr>'; // Ne retourne rien dans cet exemple } ${'toto' . $this->int_VarTest} = clone $this; # clonage de l'objet précédent avec un nom incrémenté ${'toto' . $this->int_VarTest}->int_TempValue = $this->int_VarTest; # affectation d'une nouvelle valeur (incrémentée) # Test d'existance des objets for ($i=1;$i<=$this->int_VarTest;$i++) { echo 'APRES retour de is object() pour objet : ' . 'toto' . $i . ' = ' . is_object(${'toto' . $this->int_VarTest}) . '<br>'; echo 'APRES obj toto' . $i . ', $int_TempValue = ' . ${'toto' . $this->int_VarTest}->int_TempValue . '<hr>'; } ${'toto' . $this->int_VarTest}->TestClone_MyObj(); # Appel récurcif } } $MyObj1 = new MyObj(); $MyObj1->TestClone_MyObj(); ?>
Mes questions :Notice: Undefined variable: toto1 in C:\Program Files (x86)\EasyPHP-5.3.8.1\www\(...).php on line 17
AVANT retour de is object() pour objet : toto1 =
APRES retour de is object() pour objet : toto1 = 1
APRES obj toto1, $int_TempValue = 1
Notice: Undefined variable: toto2 in C:\Program Files (x86)\EasyPHP-5.3.8.1\www\(...).php on line 17
AVANT retour de is object() pour objet : toto1 =
Notice: Undefined variable: toto2 in C:\Program Files (x86)\EasyPHP-5.3.8.1\www\(...).php on line 17
AVANT retour de is object() pour objet : toto2 =
APRES retour de is object() pour objet : toto1 = 1
APRES obj toto1, $int_TempValue = 2
APRES retour de is object() pour objet : toto2 = 1
APRES obj toto2, $int_TempValue = 2
- Est-il possible dans mon cas de rendre chaque objet toto1, toto2, etc indépendant? C'est à dire que le premier aura la valeur $int_TempValue = 1, le second $int_TempValue = 2, etc?
- Pourquoi dans les tests des cas "AVANT" l'appel à la méthode clone, aucun des objets n'existent alors qu'après l'appel, le nouveau (incrémentation) et tous ceux créés précedemment existent alors? J'aurais aimé pouvoir appeller les objets précédemment créés à l'itération précédentes avant un nouvel appel à la méthode clone. Pouvez-vous m'indiquer ce qui ne va pas dans ma façon de faire?
Partager