Bien que la plupart des scripts PHP 4 existants devraient fonctionner,
il convient de noter quelques incompatibilités avec les versions
antérieures de PHP :
Il y a quelques nouveaux mots
réservés.
strrpos() et strripos() utilisent
maintenant une chaîne de caractères complète (un seul caractère
auparavant) en tant qu'élément de recherche.
L'utilisation d'index illégaux sur une chaîne de caractères entraîne
maintenant un message E_ERROR au lieu d'un
message E_WARNING auparavant.
Voici un exemple incorrect :
$str = 'abc'; unset($str[0]);.
La fonction array_merge() a été modifiée pour
n'accepter que des tableaux. Pour chaque variable passée en paramètre
autre qu'un tableau, un message E_WARNING sera
envoyé. Soyez attentifs car votre script pourrait émettre des
E_WARNING de façon inopinée.
La variable de serveur PATH_TRANSLATED n'est plus définie implicitement
avec Apache2 SAPI contrairement à auparavant (PHP 4) où elle était fixée
avec la même valeur que SCRIPT_FILENAME lorsqu'Apache ne
la renseignait pas. Cette modification a été apportée afin d'être
en conformité avec les spécifications CGI. Merci de consulter
le bogue #23610 pour plus
d'informations, ainsi que la description de
$_SERVER['PATH_TRANSLATED']
du manuel. Ce problème affecte également PHP >= 4.3.2.
La constante T_ML_CONSTANT n'est plus
définie par l'extension Tokenizer.
Si error_reporting est réglée à E_ALL, PHP va
générer un avertissement. Bien que T_ML_CONSTANT
n'ait jamais été utilisée, elle était définie dans PHP 4. Avec PHP 4
et PHP 5, // et /* */ sont assimilés à la constante
T_COMMENT.
Toutefois les commentaires de style PHPDoc /** */,
qui sont analysés depuis PHP 5, sont reconnus en tant que
T_DOC_COMMENT.
$_SERVER contient dorénavant
argc et argv si votre
variables_order inclus "S". Si
vous avez configuré votre système pour qu'il ne
crée pas $_SERVER, ils n'existeront bien sûr pas.
Cette modification a été effectuée afin que argc et
argv soient
toujours accessibles dans la version CLI quelle que soit la valeur de
variables_order. Ainsi, la
version CLI renseignera dorénavant toujours les variables
$argc et $argv.
Un objet sans propriété n'est plus considéré comme vide
(empty()).
Dans certains cas, les classes doivent être déclarées avant d'être
utilisées. Cela survient uniquement si les nouvelles fonctionnalités de
PHP 5 (comme les interfaces)
sont utilisées. Sinon, le comportement sera le même qu'avant.
Les fonctions get_class(),
get_parent_class()
et get_class_methods() retournent désormais le nom de
la classe comme elle a été déclarée (sensible à la casse), ce qui peut
causer des problèmes dans vos anciens scripts qui utilisent le
comportement précédent (le nom de la classe était toujours retourné en
minuscules). Une solution possible est de rechercher ces fonctions
dans tous vos anciens scripts et d'utiliser la fonction
strtolower().
Ces changements de sensibilité Ã la casse sont également appliqués aux
constantes magiques
prédéfinies __CLASS__,
__METHOD__ et __FUNCTION__.
Les valeurs sont retournées exactement comme elles ont été déclarées
(sensible à la casse).
La fonction ip2long() retourne maintenant FALSE
lorsqu'une adresse IP invalide est entrée comme argument de la fonction,
et non plus -1.
Lorsque des fonctions sont définies dans un fichier inclus, elles peuvent être
utilisées dans le fichier principal, qu'elles soient définies
avant ou après l'instruction return(). Si le fichier
est inclus deux fois, PHP 5 émet une erreur fatale car les fonctions sont
toujours déclarées, tandis que PHP 4 n'a aucun problème avec ça.
Il est recommandé d'utiliser l'instruction include_once()
au lieu de vérifier si le fichier a déjà été inclus et de retourner,
conditionnellement, l'inclusion du fichier.
include_once() et require_once()
normalisent d'abord le chemin du fichier à inclure sous Windows. Donc
inclure le fichier A.php et le fichier a.php revient à n'inclure qu'une
seule fois ce fichier.