<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.oop5.cloning.php',
    1 => 'Clonage d\'objets',
    2 => 'Clonage d\'objets',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Les classes et les objets',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.final.php',
    1 => 'Mot-cl&eacute; &quot;final&quot;',
  ),
  'next' => 
  array (
    0 => 'language.oop5.object-comparison.php',
    1 => 'Comparaison d\'objets',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/oop5/cloning.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.cloning" class="sect1">
  <h2 class="title">Clonage d&#039;objets</h2>

  <p class="para">
   Le fait de créer une copie d&#039;un objet possédant exactement les mêmes
   propriétés n&#039;est pas toujours le comportement que l&#039;on souhaite. 
   Un bon exemple pour illustrer le besoin d&#039;un constructeur de copie :
   dans le cas d&#039;un objet qui représente une fenêtre GTK et qui
   contient la ressource représentant cette fenêtre GTK, lors de la
   création d&#039;une copie, il peut être souhaitable de 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. Un autre exemple est le cas où
   un objet contient une référence vers un autre objet qu&#039;il utilise et,
   lors de la réplication de l&#039;objet parent, il est souhaitable de créer
   une nouvelle instance de cet autre objet afin que la réplique possède
   sa propre copie séparée.
  </p>

  <p class="para">
   Une copie d&#039;objet est créée en utilisant le mot-clé <code class="literal">clone</code>
   (qui fait appel à la méthode <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>
   de l&#039;objet, si possible).
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
$copy_of_object = clone $object;
</pre></div>
   </div>

  </div>

  <p class="para">
   Lorsqu&#039;un objet est cloné, PHP effectue une copie superficielle de toutes
   les propriétés de l&#039;objet. Toutes les propriétés qui sont des références à d&#039;autres 
   variables demeureront des références.
  </p>

  <div class="methodsynopsis dc-description" id="object.clone">
   <span class="methodname"><strong>__clone</strong></span>(): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

  
  <p class="para">
   Une fois le clonage effectué, si une méthode <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>
   est définie, la méthode <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>
   du nouvel objet sera appelée, pour permettre à chaque propriété qui doit l&#039;être d&#039;être modifiée.
  </p>

  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exemple de duplication d&#039;objets</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">SubObject <br /></span><span style="color: #007700">{<br />  static </span><span style="color: #0000BB">$instances </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />  public </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /><br />  public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">instance </span><span style="color: #007700">= ++</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instances</span><span style="color: #007700">;<br />  }<br /><br />  public function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">() {<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">instance </span><span style="color: #007700">= ++</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$instances</span><span style="color: #007700">;<br />  }<br />}<br /><br />class </span><span style="color: #0000BB">MyCloneable <br /></span><span style="color: #007700">{<br />  public </span><span style="color: #0000BB">$object1</span><span style="color: #007700">;<br />  public </span><span style="color: #0000BB">$object2</span><span style="color: #007700">;<br /><br />  function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">() <br />  {    <br />    </span><span style="color: #FF8000">// Force la copie de this-&gt;object, sinon<br />    // il pointera vers le même objet.<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">object1 </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">object1</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyCloneable</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">object1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubObject</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">object2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubObject</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br /><br />print </span><span style="color: #DD0000">"Objet original :\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br /><br />print </span><span style="color: #DD0000">"Objet cloné :\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Objet original :
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instance] =&gt; 1
        )

    [object2] =&gt; SubObject Object
        (
            [instance] =&gt; 2
        )

)
Objet cloné :
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instance] =&gt; 3
        )

    [object2] =&gt; SubObject Object
        (
            [instance] =&gt; 2
        )

)
</pre></div>

   </div>

  </div>

  <p class="para">
   Il est possible d&#039;accéder à un membre d&#039;un objet 
   fraîchement cloné dans une seule expression:
  </p>
  <div class="example" id="example-2">
   <p><strong>Exemple #2 Accès à un membre d&#039;un objet fraîchement cloné</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dateTime </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">();<br />echo (clone </span><span style="color: #0000BB">$dateTime</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
2016
</pre></div>
   </div>
  </div>
 </div><?php manual_footer($setup); ?>