Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Verso PHP 5: (OOP) Cambiamenti pericolosi rispetto a PHP 4

Il supporto rinnovato alla programmazione ad oggetti in PHP 5 comporta alcuni rischi nella compatibilità con applicazioni progettate per PHP 4.
Il supporto rinnovato alla programmazione ad oggetti in PHP 5 comporta alcuni rischi nella compatibilità con applicazioni progettate per PHP 4.
Link copiato negli appunti

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.

Ti consigliamo anche