Clonage d'objets
Le fait de cr�er une copie d'un objet poss�dant exactement les m�mes propri�t�s n'est pas toujours le comportement que l'on souhaite. Un bon exemple pour illustrer le besoin d'un constructeur de copie : si vous avez un objet qui repr�sente une fen�tre GTK et que l'objet contient la ressource repr�sentant cette fen�tre GTK, lorsque vous cr�ez une copie vous pouvez vouloir cr�er une nouvelle fen�tre avec les m�mes propri�t�s mais que le nouvel objet contienne une ressource repr�sentant la nouvelle fen�tre.
Une copie d'objet est cr��e en utilisant le mot-cl� clone (qui fait appel � la m�thode __clone() de l'objet, si elle a �t� d�finie). La m�thode __clone() d'un objet ne peut �tre appel�e directement.
<?php $copie_d_objet = clone $objet; ?>
Lorsqu'un objet est clon�, PHP 5 effectue une copie superficielle de toutes les propri�t�s de l'objet. Toutes les propri�t�s qui sont des r�f�rences � d'autres variables demeureront des r�f�rences.
Une fois le clonage effectu�, si une m�thode __clone() est d�finie, la m�thode __clone() du nouvel objet sera appel�e pour permettre � chaque propri�t� qui doit l'�tre d'�tre modifi�e.
Exemple #1 Exemple de duplication d'objets
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $objet1;
public $objet2;
function __clone()
{
// Force la copie de this->object, sinon
// il pointera vers le m�me objet.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Objet original :\n");
print_r($obj);
print("Objet clon� :\n");
print_r($obj2);
?>
L'exemple ci-dessus va afficher :
Object original : MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) ) Object clon� : MyCloneable Object ( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) )