Migrare da PHP4 a PHP5: differenze nel riferimento ad un oggetto

Logo PHPIl 13 luglio 2007 il team di sviluppo del PHP ha annunciato la fine del supporto al PHP4 a partire dalla fine di quest’anno. Verranno ancora sviluppate eventuali patch di sicurezza solo fino ad agosto 2008. Fino ad oggi,

la maggior parte dei Internet Service Provider fornisce installazioni con PHP4, ma il recente annuncio del team di PHP forzerà gli Internet Service Provider all’aggiornamento verso il PHP5.

Questo non è affatto un passaggio negativo, né doloroso, infatti il PHP5 è ormai ampiamente rodato e non soffre di alcuni difettucci della versione precedente.

Inoltre è un linguaggio molto più moderno ed offre un supporto alla programmazione ad oggetti al pari di altri che hanno questa caratteristica fin dalla nascita come, per esempio, Java.

Insomma, questo passaggio dovrebbe essere davvero indispensabile, al punto che è persino nato un gruppo di famosi programmatori PHP (gophp5.org), quasi tutti del mondo Open source, che spinge a farlo.

Dicevo che il passaggio è anche indolore, infatti la retrocompatibilità è decisamente buona, sono solo poche le cose che devono essere modificate o al più possono provocare dei messaggi di tipo E_STRICT invece che E_NOTICE.

Il sito ufficiale pubblica un documento in lingua inglese con le indicazioni per la migrazione, PHPNews.it inoltre, ha pubblicato in lingua italiana un documento ancora più dettagliato concernente tutti i possibili problemi di migrazione.

Un nuovo importante aspetto del PHP5 è sicuramente la correzione della gestione dei riferimenti agli oggetti nel motore dell’interprete Zend.
Osserviamo, ad esempio, come si comporta PHP4 con questo frammento di codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class PersonaggiFortunati {
    var $nome;
    function PersonaggiFortunati() {
        $this->nome = "Topolino";
    }
 
}
 
$personaggi_fortunati = new PersonaggiFortunati;
 
echo $personaggi_fortunati->nome;
 
print("<br />");
 
$personaggi_sfigati = $personaggi_fortunati;
 
$personaggi_sfigati->nome = "Paperino";
 
echo $personaggi_fortunati->nome;
 
print("<br />");

Osservando il risultato in PHP4:

Topolino
Topolino

… Paperino non diventa fortunato… mentre in PHP5:

Topolino
Paperino

Questo avviene perché, mentre in PHP4 l’assegnazione di un oggetto ad una variabile avviene per valore, in PHP5 avviene implicitamente per riferimento.

Per ottenere lo stesso risultato in PHP4 avremmo dovuto cambiare il codice:

$personaggi_sfigati = $personaggi_fortunati;

in:

$personaggi_sfigati = &amp; $personaggi_fortunati;

Cioè, avremmo dovuto esplicitamente indicare che stiamo assegnando un oggetto per riferimento, attraverso l’operatore &. Questa procedura è consigliata sempre in PHP4 perché evita il sovraccarico della memoria che avviene con la duplicazione degli oggetti.

Se volessimo comunque mantenere il comportamento di PHP4 in PHP5, e risolvere i nostri problemi di compatibilità senza pensare troppo alla gestione della memoria, sarà sufficiente cambiare questa riga di codice:

$personaggi_sfigati = $personaggi_fortunati;

in:

$personaggi_sfigati = clone $personaggi_fortunati;

Conclusioni:

A discapito di poche differenze, è senz’altro consigliabile la migrazione al PHP5 che rappresenta un’evoluzione notevole del linguaggio. E’ auspicabile che chi ha utilizzato PHP fino ad oggi utilizzando una logica procedurale, approfitti dell’occasione per una definitiva conversione alla programmazione per oggetti.

Riferimenti ed approfondimenti: