Page 1 sur 2

Pointeur et objet

Posté : 14 mai 2009, 10:41
par Wells83
Bonjour, j'ai un petit soucis. Vous allez vite comprendre :
<?

class toto
	{
	public $valeur;
	}
	
	
$toto1 = new toto;
$toto1->valeur='A';

$pouet=array();
$pouet2=array();

$pouet[0]=$toto1;
$pouet2[0]=$toto1;

$pouet[0]->valeur='B';

echo $pouet2[0]->valeur;//affiche B

?>
Comme vous le constatez mes deux tableaux sont des pointeurs, puisque modifier l'un modifie l'autre.

Hors moi j'aimerais avoir un objet dans chacun de mes tableaux. Cela me permettra de faire tt les modifs que je veuc dans $pouet tout en gardant une sauvegarde de l'état initial dans $pouet2.

qq'un a une solution ?

Posté : 14 mai 2009, 10:44
par Sodams
Crée un constructeur de copie
public __construct(/*toto*/ $toto)
{
    $this->valeur = $toto->valeur;
}
Tu pourras ainsi faire
$pouet2[0]=new toto($toto1); 
qui va créé une nouvelle instance de ta classe identique à $toto.

Posté : 14 mai 2009, 11:04
par Genova
Salut,
première chose les pointeurs ça n'existe pas en PHP, c'est des références ;)

Sinon il te suffit d'utiliser la fonction native clone() de PHP pour cloner un objet :
$pouet2[0] = clone($toto1);

Posté : 14 mai 2009, 11:04
par pascaltje
le clonage pourrait t'aider je pense :
http://fr.php.net/manual/fr/language.oop5.cloning.php

A+

Pascal

edit : pwnd !

Posté : 14 mai 2009, 11:22
par Nagol
il faut cloner!

fake mistake postcount++ FTW

Posté : 14 mai 2009, 11:26
par Sodams
Oui c'est vrai la fonction clone(); je l'avais oublié celle là.
(Trop de C++ à mon avis)

Attention si tu copies des objets, la méthode clone ne fais pas une copie profonde.

class A{
    public $a;
}
class B{
    public $ca; // Object de type a
    public $b;
}

$b = new B();
$b->ca = new A();
$b->ca->a = 1;
$b->b = 1;

$b2 = clone $b;
$b2->ca->a = 2; 
$b2->b = 2;

echo $b->ca->a; // OUTPUT 2 au lieu de 1
echo $b->b; // OUTUT 1

echo $b2->ca->a; // OUTPUT 2
echo $b2->b; // OUTPUT 2

Cependant ce type de problème peut-être facilement résolut en implément dans la classe B la méthode clone().
function __clone()
{
        $this->ca = clone $this->ca;
}

Posté : 14 mai 2009, 11:32
par Wells83
Hum quand je rajouter la méthode clone dans ma classe:

Code : Tout sélectionner

Fatal error: Cannot override final method Exception::__clone()
noté que ma classe hérite d'une autre. Placé la méthode clone dans la classe mère produit le même message dans la dites classe mère.

Posté : 14 mai 2009, 11:34
par Sodams
N'oublie pas de préciser que la fonction est en public
    public function __clone();

Posté : 14 mai 2009, 12:03
par Wells83
Le public ne change rien :(

Posté : 14 mai 2009, 12:48
par mojorisin
Votre classe hérite de Exception, hors la méthode clone de cette classe native de php est marquée comme finale, vous ne pouvez pas la surcharger.

Posté : 14 mai 2009, 12:52
par Wells83
erf, donc qq aurait une solution ^^

non parce que ma class à plus d'une centaine de propriétés, je me vois mal faire une classe clone à la main ^^

y a t'il moyen de parcourir les propriétés d'une classe afin d'automatiser la chose?

Posté : 14 mai 2009, 13:11
par mojorisin
Quelle est la finalité ?
J'ai du mal a voir pourquoi vous avez besoin de cloner une exception,

Une centaine de proprietés me parait également enorme sur un seul objet, ceci dit, dans ce cas, je vous conseille plutot d'utiliser un tableau interne privé pour vos propriétés et de l'interroger via les méthodes magique __set() et __get() (je vous laisse consulter la documentation sur ces méthodes).

Posté : 14 mai 2009, 14:01
par Wells83
je clone pas une exception, ma classe hérite d'une classe qui elle même hérite d'une exception c'est tout.

Après j'essaye de cloner une class normale avec propriété + méthode :)

Posté : 14 mai 2009, 14:06
par Nagol
on clone un objet et non pas une classe je vois pas ou est ton probleme

Posté : 14 mai 2009, 14:08
par Wells83
Bon ben j'ai fait ma propre méthode:
	function clonage($BATIMENT)
		{    
		$CLONE = new WBatiment;
		foreach($BATIMENT as $key=>$value)
			$CLONE->$key=$value;
		return $CLONE;
		}