Dopo la breve introduzione alla direttiva zend.ze1_compatibility_mode, è doveroso proseguire il nostro cammino verso PHP 5 analizzando i principali cambiamenti nelle funzioni che potrebbero minare la retrocompatibilità del nostro programma.
PHP 5 ha introdotto diverse nuove funzioni, alcune molto interessanti in merito alla gestione degli array.
Tuttavia, sempre in tema di funzioni, alcune già presenti in PHP 4 hanno variato parte del loro comportamento rappresentando un problema nel caso il vostro programma le utilizzi e venga migrato a PHP 5.
La lista completa è disponibile alla voce Backward Incompatible Changes della documentazione di PHP 5, ma vediamo alcune casistiche.
I nomi delle classi sono ora case-sensitive
Una delle novità principali di PHP 5 è il miglioramento del supporto alla programmazione object oriented (OOP).
Alcune modifiche non potevano dunque interessare le funzioni parte di PHP 4 che già interagivano con il limitato supporto object oriented di questa versione del linguaggio.
Le funzioni get_class(), get_parent_class() e get_class_methods() ora restituiscono i nomi delle classi e delle funzioni così come sono stati dichiarati, differenziando maiuscole da minuscole, mentre in PHP 4 il valore restituito è sempre minuscolo.
Lo stesso discorso per quanto riguarda le costanti __CLASS__
, __METHOD__
e __FUNCTION__
.
Dato questo esempio
class Test() { function Test() { // costruttore compatibile con PHP 4 } function testClass() { return get_class(this); // identico a return __CLASS__ in questo caso } function testMethod() { return __METHOD__; } }
avremo in PHP 4
$t = new Test(); print $t->testClass(); // test print $t->testMethod(); // testmethod
mentre in PHP 5
$t = new Test(); print $t->testClass(); // Test print $t->testMethod(); // testMethod
Oggetti, proprietà ed empty
Per quanto riguarda gli oggetti, un oggetto senza proprietà assegnate non è più considerato come empty
, come dimostra il codice seguente.
class Test { } $t = new Test(); var_dump(empty($t)); // bool(false)
dunque una condizione tipo
if ($t) { // }
verrà eseguita.
Sempre in tema di oggetti e funzioni, la funzione is_a() è stata deprecata, in favore dell'operatore instanceof.
L'uso di is_a()
al momento non vi causerà problemi, tuttavia è possibile che in futuro questa funzione non sia più disponibile.
class Test { function Test() { // } } $t = new Test(); // in PHP 4 if (is_a($t, 'Test')) { echo '$t è una istanza della classe Test'; } // in PHP 5 if ($t instanceof Test) { echo '$t è una istanza della classe Test'; }
Cambio di parametri, risposta o comportamento
Alcune funzioni hanno cambiato il loro comportamento, altre il tipo di parametri, altre ancora la risposta.
array_merge(), a partire da PHP 5, accetta solo array come parametri.
Potete applicare un cast di tipo ad array per essere sicuro che il parametro sia sempre un array.
$s = 'foo'; $a = array('bar'); // questa riga in PHP 4 funziona // in PHP 5 genera errore $r = array_merge($s, $a); // ecco un piccolo workaround // che funziona in PHP 4 e PHP 5 $r = array_merge((array) $s, (array) $a);
Le funzioni strrpos() e strripos() richiedono che il parametro $needle sia una stringa, la sua lunghezza può superare il valore di un singolo carattere.
L'intera stringa sarà usata per il confronto.
Infine, la funzione ip2long() utile a convertire un IPv4 in un intero ora restituisce false
in caso il formato del parametro in ingresso non sia valido, in alternativa a -1
.
$ip = '192.168.1.280'; // ip errato $long = ip2long($ip); // non funziona in PHP 5 if ($long == -1) { // ... } // funziona in PHP 4 e PHP 5 if ($long == -1 || $long === false) { // ... }
include_once() e require_once() più intelligenti
Cambiamenti anche per include_once()
e require_once()
.
I percorsi dei file inclusi, infatti, ora vengono normalizzati prima di essere processati quindi le seguenti casistiche sono ora escluse
- In Windows, includere File.inc.php e file.inc.php non causerà l'inclusione duplice del file
- Includere File.inc.php e ../cartellaCorrente/File.inc.php non causerà l'inclusione duplice del file
In conclusione
Nel caso in cui il vostro applicativo contiene elementi che rientrano in una delle casistiche sopra segnalate, è necessario agire al fine di rendere il programma compatibile con PHP 5.
A seconda delle necessità , il supporto a PHP 4 potrebbe essere mantenuto o volontariamente escluso (consigliato).