<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.oop5.cloning.php',
    1 => 'Clonaci&oacute;n de objetos',
    2 => 'Clonaci&oacute;n de objetos',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Clases y objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.final.php',
    1 => 'Palabra clave &quot;final&quot;',
  ),
  'next' => 
  array (
    0 => 'language.oop5.object-comparison.php',
    1 => 'Comparaci&oacute;n de objetos',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Clonación de objetos</h2>

  <p class="para">
   La creación de una copia de un objeto con exactamente las mismas
   propiedades no siempre es el comportamiento deseado.
   Un buen ejemplo para ilustrar la necesidad de un constructor de copia:
   si se tiene un objeto que representa una ventana GTK y el objeto
   contiene el recurso que representa esa ventana GTK, al crear una copia,
   se puede desear crear una nueva ventana con las mismas propiedades,
   pero que el nuevo objeto contenga un recurso que represente la nueva ventana.
  </p>

  <p class="para">
   Una copia de objeto se crea utilizando la palabra clave <code class="literal">clone</code>
   (que invoca al método <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>
   del objeto, si ha sido definido).
  </p>

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

  </div>

  <p class="para">
   Cuando un objeto es clonado, PHP realiza una copia superficial de todas
   las propiedades del objeto. Todas las propiedades que son referencias a otras
   variables permanecerán como referencias.
  </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">
   Una vez realizada la clonación, si se ha definido un método <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>,
   el método <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>
   del nuevo objeto será llamado, para permitir que cada propiedad que deba ser modificada lo sea.
  </p>

  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Ejemplo de duplicación de objetos</strong></p>
   <div class="example-contents">
<div class="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">$objet1</span><span style="color: #007700">;<br />  public </span><span style="color: #0000BB">$objet2</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">// Fuerza la copia de this-&gt;object, de lo contrario<br />    // apuntará al mismo objeto.<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 />print </span><span style="color: #DD0000">"Objeto 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">"Objeto clonado :\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>El ejemplo anterior mostrará:</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
Objeto original :
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instance] =&gt; 1
        )

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

)
Objeto clonado :
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instance] =&gt; 3
        )

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

)
</pre></div>

   </div>

  </div>

  <p class="para">
   Es posible acceder a un miembro de un objeto
   recién clonado en una sola expresión:
  </p>
  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 Acceso a un miembro de un objeto recién clonado</strong></p>
   <div class="example-contents">
<div class="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>Resultado del ejemplo anterior es similar a:</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
2016
</pre></div>
   </div>
  </div>
</div><?php manual_footer($setup); ?>