Cambiamenti non compatibili
Anche se la maggior parte del codice PHP 4 esistente dovrebbe funzionare senza modifiche, occorre fare attenzione ai seguenti cambiamenti incompatibili col codice precedente:
- Ci sono alcune nuove parole chiave riservate.
- strrpos() e strripos() ora utilizzano l'intera stringa come argomento di ricerca.
- L'uso illegale degli offset delle stringhe causa E_ERROR invece di E_WARNING. Un esempio di utilizzo illegale è: $str = 'abc'; unset($str[0]);.
- array_merge() è stata cambiata per accettare solo array. Se viene passata una variabile che non è un array, un E_WARNING viene lanciato per ogni parametro. Prestare attenzione, poiché il codice può cominciare ad emettere E_WARNING improvvisamente.
- La variabile server PATH_TRANSLATED non è più impostata implicitamente sotto Apache2 SAPI diversamente che in PHP 4, dove è impostato allo stesso valore della variabile server SCRIPT_FILENAME quando non è riempito da Apache. Questa modifica è stata fatta per adeguarsi alle » specifiche CGI. Consultare il » bug #23610 per ulteriori informazioni, e vedere anche la descrizione di $_SERVER['PATH_TRANSLATED'] nel manuale. Questo problema interessa anche le versioni di PHP >= 4.3.2.
- La costante T_ML_COMMENT non è più definita dall'estensione Tokenizer. Se error_reporting è impostata a E_ALL, PHP genera un avviso. Anche se la costante T_ML_COMMENT non è mai stata utilizzata, era definita in PHP 4. Sia in PHP 4 che in PHP 5 // e /* */ sono risolte come la costante T_COMMENT. Comunque i commenti in stile PHPDoc /** */, che a partire da PHP 5 sono analizzate da PHP, sono riconosciute come T_DOC_COMMENT.
- $_SERVER dovrebbe essere popolata con argc e argv se variables_order include "S". Se si è configurato il sistema in modo da non creare $_SERVER, ovviamente questa non dovrebbe comparire. La modifica è stata quella di rendere argc e argv disponibile nella versione CLI a prescindere dall'impostazione di variables_order. Di conseguenza, la versione CLI ora popolerà sempre le variabili globali $argc e $argv.
- Un oggetto senza proprietà non è più considerato "vuoto".
- In alcuni casi le classi devono essere dichiarate prima dell'utilizzo. Questo succede solo se è usata qualcuna delle nuove caratteristiche di PHP 5 (come le interfacce). In caso contratio il comportamento è quello vecchio.
- get_class(), get_parent_class() e get_class_methods() ora restituiscono il nome di classi/metodi come sono dichiarati (case-sensitive) il che può portare a problemi in vecchi script che si basano sul comportamento precedente (il nome di classe/metodo era sempre restituito a caratteri minuscoli). Una soluzione possibile è quella di cercare queste funzioni negli script ed utilizzare strtolower(). Questa modifica alla sensibilità di maiuscole/minuscole si applica anche alle costanti magiche predefinite __CLASS__, __METHOD__, e __FUNCTION__. I valori sono restituiti esattamente come dichiarati (case-sensitive).
- ip2long() ora restituisce FALSE quando un IP address non valido è passata come argomento alla funzione, e non più -1.
- Se esistono funzioni definite in un file incluso, queste possono essere utilizzate nel file principale indipendentemente dal fatto che siano prima di return() o dopo. Se il file è incluso due volte, PHP 5 emette un errore fatale poiché le funzioni erano già dichiarate, mentre PHP 4 non si lamenta di questo. Si raccomanda di utilizzare include_once() invece di controllare se il file è stato già incluso e fare un return condizionato all'interno del file incluso.
- include_once() e require_once() in Windows per prima cosa normalizzano il percorso del file incluso in modo tale che includere A.php e a.php provochi una sola inclusione del file.
Example#1 strrpos() e strripos() ora utilizzano l'intera stringa come argomento di ricerca
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Example#2 Un oggetto senza proprietà non è più considerato "vuoto"
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// Viene eseguito
}
?>
Example#3 In alcuni casi le classi devono essere dichiarate prima dell'utilizzo
<?php
//funziona senza errori:
$a = new a();
class a {
}
//emette un errore:
$a = new b();
interface c{
}
class b implements c {
}
?>