Classi php reference, clone, duplicate

 

È 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

// Classe sorgente
$class = new stdClass();
// Assegnazione
$a = $class;
// Referenza
$b = &$class; // Clonazione
$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:

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.