Pb sur clone, et arrayObject

Mammouth du PHP | 505 Messages

28 mars 2006, 09:29

<?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ésultat

Code : 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
Quelqu'un a une idée sur ce qui vas pas dans cette fonction 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...