Nouveautés de PHP 5.0.x
CLI et CGI
Migration de PHP 4 à PHP 5.0.x
PHP Manual

## 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 :

- 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.
- Le fait de passer un tableau à une fonction par sa valeur ne réinitialise plus le pointeur interne pour les tableaux dont on accède à l'intérieur de la fonction. En d'autres termes, en PHP 4, lorsque vous passiez un tableau à une fonction, son pointeur interne à l'intérieur de la fonction était réinitialisé, tandis qu'en PHP 5, lorsque vous passez un tableau à une fonction, le pointeur interne du tableau à l'intérieur de la fonction reste à la même position que lorsqu'il est passé à la fonction.

Exemple #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 #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 #3 Dans certains 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 {
}
?>`

Nouveautés de PHP 5.0.x
CLI et CGI
Migration de PHP 4 à PHP 5.0.x
PHP Manual