Salut,
un code valant mieux qu'un long discours, avec ça tu devrais comprendre directement la différence entre clonage et pas clonage :
class Test
{
public $toto;
}
// On instancie une première fois Test et on set la propriété toto sur bidule
$test1 = new Test;
$test1->toto = 'bidule';
// En PHP5, le code ci dessous fait une copie par référence
$test2 = $test1;
// Donc quand je modifie $test2->toto je modifie en fait $test1->toto aussi
$test2->toto = 'nouveau machin';
// La preuve :
echo 'test1->toto = ' . $test1->toto . '<br />';
echo 'test2->toto = ' . $test2->toto . '<br />';
echo '----------<br />';
// Là maintenant je fais un objet $test3 en clonant $test2
$test3 = clone $test2;
// Si je modifie $test3->toto, ben ni $test1 ni $test2 ne seront modifiés
$test3->toto = 'le truc ultime';
// La preuve :
echo 'test1->toto = ' . $test1->toto . '<br />';
echo 'test2->toto = ' . $test2->toto . '<br />';
echo 'test3->toto = ' . $test3->toto . '<br />';[/code]
ce qui affichera à l'écran
[quote]test1->toto = nouveau machin
test2->toto = nouveau machin
----------
test1->toto = nouveau machin
test2->toto = nouveau machin
test3->toto = le truc ultime
Donc en clair si tu veux créer un nouveau objet à partir du premier, mais que tu veux qu'il soit indépendant du premier, il faut le cloner.
Important : en PHP4, lorsque tu fais $test1 = $test2 l'objet est automatiquement cloné. c'est une des différences entre PHP4 et PHP5, et sur un projet totalement orienté objet ça peut jouer sur la portabilité.
Astuce : voici un moyen de rendre le clone portable en PHP4 / PHP5 :
if (version_compare(phpversion(), '5.0') < 0)
{
eval('function clone($object){return($object);}');
}
Modifié en dernier par
Genova le 19 juil. 2007, 14:14, modifié 1 fois.