<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'language.oop5.cloning.php',
    1 => 'Clonazione di oggetti',
    2 => 'Clonazione di oggetti',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classi e Oggetti',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.final.php',
    1 => 'Final Keyword',
  ),
  'next' => 
  array (
    0 => 'language.oop5.object-comparison.php',
    1 => 'Comparing Objects',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    '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">Clonazione di oggetti</h2>
  
  <p class="para">
   Creare una copia di un oggetto con tutte le proprietà replicate non è
   sempre il comportamento desiderato. Un esempio della necessità di
   costruttori per la copia, è che quando si ha un oggetto che rappresenta una finestra GTK e
   l&#039;oggetto detiene le risorse di questa finestra GTK, quando si crea un duplicato
   si può voler creare una nuova finestra con le stesse proprietà e fare in modo che il
   nuovo oggetto detenga le risorse della nuova finestra. Un ulteriore esempio è il caso in cui un
   oggetto ha un riferimento ad un altro oggetto che utilizza e quando si 
   replica il l&#039;oggetto padre si vuole creare una nuova istanza di questo altro
   oggetto in modo che la replica ne abbia una propria copia separata dall&#039;originale.
  </p>

  <p class="para">
   La copia di un oggetto viene creata utilizzando la parola chiave <em>clone</em> (che chiama se possibile
   il metodo <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a> dell&#039;oggetto).
   Il metodo <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a> di un oggetto
   non può essere invocato direttamente.
  </p>

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

  </div>

  <p class="para">
   Quando un oggetto viene clonato, PHP 5 esegue una copia superficiale di tutte le
   proprietà dell&#039;oggetto. Ogni proprietà che sia un riferimento ad altre variabili
   rimarrà un riferimento.
  </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">
   Completata la clonazione, se esiste un metodo <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>, 
   viene chiamato il metodo <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a> dell&#039;oggetto appena creato per consentire
   l&#039;aggiornamento di tutte le proprietà che necessitano di essere modificate.
  </p>

  <div class="example" id="example-1">
   <p><strong>Example #1 Clonazione di un oggetto</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">$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">// forza la copia di $this-&gt;object1, che altrimenti<br />        // punterebbe alla stessa istanza.<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">"Oggetto originale:\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">"Oggetto clonato:\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>Il precedente esempio visualizzerà:</p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
Oggetto orginale:
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instance] =&gt; 1
        )

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

)
Oggetto clonato:
MyCloneable Object
(
    [object1] =&gt; SubObject Object
        (
            [instance] =&gt; 3
        )

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

)
</pre></div>

   </div>

  </div>

 </div><?php manual_footer($setup); ?>