È molto interessante notare la differenza tra clonazione, duplicazione e referenza ad una classe. In questo piccolo articolo ci chiariremo le idee in tal senso.
Vi invito ad eseguire lo script che segue in un file .php
1 2 3 4 5 6 7 8 9 10 11 12 |
// Classe sorgente $class = new stdClass(); // Assegnazione $a = $class; // Referenza<br>$b = &$class; // Clonazione<br>$c = clone $class; // Creo una proprietà per $class e gli assegno un valore. $class->roba = 'roba'; // Dump delle differenze var_dump($a); var_dump($b); var_dump($c); |
Il risultato che io ottengo è il seguente:
1 2 3 4 5 6 7 8 9 10 |
object(stdClass)#1 (1) { ["roba"]=> string(4) "roba" } object(stdClass)#1 (1) { ["roba"]=> string(4) "roba" } object(stdClass)#2 (0) { } |
Come dobbiamo interpretare questo risultato?
La questione è molto semplice come possiamo vedere:
- $class è la classe sorgente;
- $a rappresenta una copia di $class ottenuta per assegnazione (tramite l’operatore di assegnazione ‘=’);
- $b referenzia $a, significa che è un puntatore alla risorsa, non un suo duplicato;
- $c è invece un clone della classe.
Quello che vediamo nei 3 var_dump è:
- che $a e $b si comportano allo stesso modo e dal numero identificativo della risorsa (quello con il cancelletto) capiamo che si tratta della stessa cosa (ovvero di puntatori a $class);
- $c invece rappresenta una nuova istanza della classe (stdClass) ottenuta per clonazione.