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
        )

)