Pointeur et objet

Eléphant du PHP | 113 Messages

14 mai 2009, 10:41

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 ?

Eléphant du PHP | 70 Messages

14 mai 2009, 10:44

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.
Damien Vande Kerckhove - Developer PHP & .net
Mon blog

ViPHP
ViPHP | 928 Messages

14 mai 2009, 11:04

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);

ViPHP
ViPHP | 1024 Messages

14 mai 2009, 11:04

le clonage pourrait t'aider je pense :
http://fr.php.net/manual/fr/language.oop5.cloning.php

A+

Pascal

edit : pwnd !

ViPHP
ViPHP | 3300 Messages

14 mai 2009, 11:22

il faut cloner!

fake mistake postcount++ FTW
Fait du php depuis que ca existe ou presque :)

Eléphant du PHP | 70 Messages

14 mai 2009, 11:26

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;
}
Damien Vande Kerckhove - Developer PHP & .net
Mon blog

Eléphant du PHP | 113 Messages

14 mai 2009, 11:32

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.

Eléphant du PHP | 70 Messages

14 mai 2009, 11:34

N'oublie pas de préciser que la fonction est en public
    public function __clone();
Damien Vande Kerckhove - Developer PHP & .net
Mon blog

Eléphant du PHP | 113 Messages

14 mai 2009, 12:03

Le public ne change rien :(

Eléphant du PHP | 217 Messages

14 mai 2009, 12:48

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.

Eléphant du PHP | 113 Messages

14 mai 2009, 12:52

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?

Eléphant du PHP | 217 Messages

14 mai 2009, 13:11

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).

Eléphant du PHP | 113 Messages

14 mai 2009, 14:01

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 :)

ViPHP
ViPHP | 3300 Messages

14 mai 2009, 14:06

on clone un objet et non pas une classe je vois pas ou est ton probleme
Fait du php depuis que ca existe ou presque :)

Eléphant du PHP | 113 Messages

14 mai 2009, 14:08

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;
		}