Dopo il post introduttivo agli oggetti in PHP 5, è bene fermarsi un momento per alcune raccomandazioni.
In PHP 5 una delle modifiche più rilevanti che riguardano la retrocompatibilità è il passaggio degli oggetti per riferimento e non per valore.
Questo significa, ad esempio, che modificare un oggetto passato come parametro all'interno di una funzione, in PHP 5 modificherà lo stato dell'oggetto stesso anche al di fuori della funzione stessa.
function Test() { function Test() { $var = 'foo'; } function setVar($value) { $var = $value; } function getVar() { return $var; } } function testVar($obj, $f) { $obj->setVar('bar'); $foo = 'bar'; } $t = new Test(); $foo = 'foo'; echo $t->getVar(); // foo echo $foo; // foo testVar($t, $foo); echo $t->getVar(); // ? echo $foo; // foo
Dato l'esempio sopra, in PHP 5 l'ultima chiamata restituirà 'bar'
poiché l'oggetto è passato alla funzione per riferimento.
Di conseguenza la funzione modifica l'oggetto originale, non una sua copia come avviene ad esempio per i parametri stringa, nel nostro caso $foo
.
Lo stesso discorso non vale in PHP 4 dove l'ouput della penultima riga sarebbe 'foo'
.
Per non modificare l'originale di un oggetto potete copiarne il valore grazie all'operatore clone
.
Nel nostro esempio, potremmo modificare la funzione testVar()
come segue.
function testVar($obj, $f) { $o = clone $obj; $o->setVar('bar'); $foo = 'bar'; }
Attenzione, un semplice $o = $obj
otterrebbe lo stesso effetto iniziale poiché la copia, anche in questo caso, avverrebbe per riferimento.
Come visto nel post precedente, il comportamento dell'operatore clone
può essere modificato a piacere sovrascrivendo la funzione __clone()
nella definizione della classe.