20. Clonare gli Oggetti
Ho deciso di scrivere questo capitolo vista la novità introdotta con PHP 5 in merito alla creazione di istanze.
In PHP 4, durante la creazione di un oggetto attraverso la parola chiave new, veniva restituito l'oggetto stesso e questo veniva memorizzato nella variabile specificata.
In PHP 5 invece, quando creiamo una nuova istanza ($oggetto = new MiaClasse();), new ci restituisce non il nuovo oggetto ma bensì un riferimento ad esso.
Se quindi non fate attenzione manipolando le istanze dei vari oggetti, potreste facilmente incappare in un errore tanto facile da risolvere quanto difficile da trovare. Ricapitolando, in PHP 5 se assegnate ad una variabile l'istanza di un oggetto, l'assegnazione avverrà per riferimento poichè l'istanza stessa contiene solo un riferimento all'oggetto creato. Se volete quindi creare una copia di un'istanza, dovrete clonarla. |
Esempio clonazione Oggetti
<?php
class Oggetto
{
public $valore;
public function Oggetto($v)
{
$this->valore = $v;
}
}
$istanza1 = new Oggetto(5);
$istanza2 = $istanza1; // Assegnazione per riferimento
$istanza3 = clone $istanza1; // Clonazione oggetto
$istanza2->valore = 7; // Modifica anche $istanza1
$istanza3->valore = 13;
echo $istanza1->valore; // Non stampa 5 ma 7
echo $istanza2->valore; // Stampa 7
echo $istanza3->valore; // Stampa 13
?>Volendo è possibile controllare il processo di clonazione.
Per farlo PHP ci consente di definire all'interno delle nostre classi il metodo __clone().
<?php
class Oggetto
{
public $valore;
public function Oggetto($v)
{
$this->valore = $v;
}
public function __clone()
{
$this->valore = "Sono stato clonato!";
}
}
$istanza1 = new Oggetto(5);
$istanza2 = clone $istanza1;
echo $istanza1->valore; // Stampa 5
echo $istanza2->valore; // Stampa "Sono stato clonato!"
?>Clonando un oggetto, per definizione si crea una copia esatta di tale oggetto, quindi i riferimenti contenuti in esso saranno comunque copiati come tali, e dopo la clonazione conterranno ancora il riferimento alla stessa risorsa di prima.
