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

Verso PHP 5: cambiamenti non retrocompatibili

Uno sguardo ai principali cambiamenti di PHP 5 che potrebbero rendere incompatibile la vostra applicazione pensata per PHP 4.
Uno sguardo ai principali cambiamenti di PHP 5 che potrebbero rendere incompatibile la vostra applicazione pensata per PHP 4.
Link copiato negli appunti

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

  1. In Windows, includere File.inc.php e file.inc.php non causerà  l'inclusione duplice del file
  2. 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).

Ti consigliamo anche