Manuel PHP
Précédent | Annexe B. Migration de PHP 4 vers PHP 5 | Suivant

# Incompatibilités avec les version antérieures

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 :

- strrpos() et strripos() utilisent maintenant la 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ère entraîne maintenant un message `E_ERROR` au lieu d'un message `E_WARNING` auparavant.

- 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 bug #23610 pour plus d'informations.

- La constante `T_ML_CONSTANT` n'est plus définie par l'extension Tokenizer. Si error_reporting est réglé à `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 est maintenant renseignée avec argc et argv si votre variables_order inclus "S". Si vous avez configuré votre système pour qu'il ne créé pas $_SERVER, il ne seront bien sûr pas renseignés. Cette modification a été effectuée afin que argc et argv soient toujours accessibles dans la version CLI quelque 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().

- Les classes doivent être déclarées avant d'être utilisées. Cela survient uniquement si les nouvelles fonctionnalités de PHP 5 sont utilisées. Sinon, le comportement sera le même qu'avant.

- La fonction get_class() demande à PHP 5 de retourner le nom de la classe utilisée tel que déclarée, ce qui peut résoudre des problèmes dans les vieux scripts intervenants dans le comportement précédent (le nom de la classe était en minuscule). Une solution possible consiste à rechercher la fonction get_class() dans tous vos scripts et d'utiliser la fonction strtolower().

- La fonction ip2long() retourne maintenant `FALSE` lorsqu'une adresse IP invalide est entrée comme argument de la fonction, et non plus -1.

- S'il y a des fonctions définies dans le fichier inclu, elles peuvent être utilisées dans le fichier principal s'il y a avant ou après, return(). Si le fichier est inclu 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 la structure de langage include_once() au lieu de vérifier si le fichier a déjà été inclu et de retourner, conditionnellement, l'inclusion du fichier.

- include_once() et require_once() normalise 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 le fichier.

Exemple B-1. strrpos() et strripos() recherchent maintenant une chaîne de caractères dans une autre

`<?php var_dump(strrpos('ABCDEF','DEF')); //int(3) var_dump(strrpos('ABCDEF','DAF')); //bool(false) ?>`

Exemple B-2. Un objet sans propriété n'est plus considéré comme vide, empty()

`<?php class test { } $t = new test(); var_dump(empty($t)); // echo bool(false) if (!$t) { // Cette portion de code sera exécutée } ?>`

Exemple B-3. Suivant les cas, les classes doivent être déclarées avant d'être utilisées

`<?php // fonctionne sans erreur : $a = new a(); class a { } // ici, une erreur : $a = new b(); interface c{ } class b implements c { } ?>`

Précédent | Sommaire | Suivant
Migration de PHP 4 vers PHP 5 | Niveau supérieur | CLI et CGI