<?php
class bidon {
public $foo = "bidon 1";
}
class test extends ArrayObject {
public $pub = 1;
public function __clone() {
$this->pub = "cloned";
foreach ($this as $k=>$item) {
$this[$k]= clone $item;
$this[$k]->foo++;
}
}
public function copy() {
$this->pub1 = "perso cloned";
$clone = new test;
foreach ($this as $item) {
$clone->append(clone $item);
}
return $clone;
}
}
$original = new test;
$original->append(new bidon());
$original->append(new bidon());
$cloned2 = clone $original;
$cloned3 = $original->copy();
// Traces
var_dump($original);
var_dump($cloned2);
var_dump($cloned3);
$original[0]->foo = "not cool";
$cloned3[1]->foo = "It's Ok";
var_dump($original);
var_dump($cloned2);
var_dump($cloned3);
if($original === $cloned2) {
echo "bad master clone# $original $cloned2<br>";
} else { echo "good master clone<br>";}
foreach ($original as $k=>$obj) {
if($original[$k] === $cloned2[$k]) {
echo "bad clone childs# $original[$k] $cloned2[$k]<br>";
} else { echo "good child clone<br>";}
}
echo "<hr>";
if($original === $cloned3) {
echo "bad masterPerso clone# $original $cloned3<br>";
} else { echo "good masterPerso clone<br>";}
foreach ($original as $k=>$obj) {
if($original[$k] === $cloned3[$k]) {
echo "bad clonePerso childs# $original[$k] $cloned3[$k]<br>";
} else { echo "good childPerso clone<br>";}
}
et le résultatCode : Tout sélectionner
// $original
object(test)#1 (2) {
[0] = object(bidon)#7 (1) {
[foo] = string(7) "bidon 2"
}
[1] = object(bidon)#2 (1) {
[foo] = string(7) "bidon 2"
}
}
// $cloned
object(test)#4 (2) {
[0] = object(bidon)#7 (1) {
[foo] = string(7) "bidon 2"
}
[1] = object(bidon)#2 (1) {
[foo] = string(7) "bidon 2"
}
}
// $Perso
object(test)#3 (2) {
[0] = object(bidon)#8 (1) {
[foo] = string(7) "bidon 2"
}
[1] = object(bidon)#9 (1) {
[foo] = string(7) "bidon 2"
}
}
// Apres affectation
// $original
object(test)#1 (2) {
[0] = object(bidon)#7 (1) {
[foo] = string(8) "not cool"
}
[1] = object(bidon)#2 (1) {
[foo] = string(7) "bidon 2"
}
}
// $cloned
object(test)#4 (2) {
[0] = object(bidon)#7 (1) {
[foo] = string(8) "not cool"
}
[1] = object(bidon)#2 (1) {
[foo] = string(7) "bidon 2"
}
}
// $Perso
object(test)#3 (2) {
[0] = object(bidon)#8 (1) {
[foo] = string(7) "bidon 2"
}
[1] = object(bidon)#9 (1) {
[foo] = string(7) "It's Ok"
}
}
good master clone
bad clone childs# Object id #7 Object id #7
bad clone childs# Object id #2 Object id #2
--------------------------------------------------------------------------------
good masterPerso clone
good childPerso clone
good childPerso clone
Elle devrait normalement produire un résultat équivalent a la fonction copy et générer une copie de l'objet original mais aussi du tableau d'objet interne, hors seule l'original est cloné.
NB:On voit les référence équivalent en comparant les numéro d'instance #X
Un code équivalent qui n'hérite pas de la classe SPL arrayObject ne pose pas de problème... et la fonction __clone clone correctement. Le pb apparait quand on derive arrayObject...