Aller au contenu principal

Migration PHP · 7.4 → 8.0 → 8.1 → 8.2 → 8.3

Migrer de PHP 7.4 à PHP 8.3

PHP 7.4 ne reçoit plus de correctifs de sécurité depuis novembre 2022 ; PHP 8.3 reste couvert par les correctifs de sécurité jusqu’en décembre 2027. La montée traverse 4 versions (8.0, 8.1, 8.2 et 8.3), chacune avec ses incompatibilités documentées dans le manuel PHP. 8 ruptures à fort impact sur le parcours. Première rupture à traiter : comparaison lâche nombre/chaîne non numérique : on compare désormais en chaîne, donc 0 == 'foo' vaut false. Fait sauter beaucoup de conditions legacy.

Où en est le support de PHP 7.4 et 8.3 ?

Support de PHP 7.4 et 8.3
CritèrePHP 7.4PHP 8.3
Sortienovembre 2019novembre 2023
Fin des correctifs de bugsnovembre 2021décembre 2025
Fin des correctifs de sécuriténovembre 2022décembre 2027

Statuts vérifiés le 08/11/2026 sur les pages officielles de version.

Les ruptures à traiter en premier

  1. Bloquant · 8.0Comparaison lâche nombre/chaîne non numérique : on compare désormais en chaîne, donc 0 == 'foo' vaut false. Fait sauter beaucoup de conditions legacy.source
  2. Bloquant · 8.0L'opérateur @ ne masque plus les erreurs fatales ; error_reporting par défaut passe à E_ALL et display_startup_errors est activé.source
  3. Bloquant · 8.1Passer null à un paramètre non nullable d'une fonction interne est déprécié (strlen(null), trim(null)…) : source massive d'avertissements.source

Le chemin de migration, étape par étape

Chaque version mineure de PHP a son guide de migration officiel ; on les applique dans l’ordre, avec la CI au vert entre deux étapes. Avant de lancer le chantier, un audit Bear Scan avant de migrer chiffre la dette qui ralentira chaque étape.

Passer à PHP 8.0

  • BloquantComparaison lâche nombre/chaîne non numérique : on compare désormais en chaîne, donc 0 == 'foo' vaut false. Fait sauter beaucoup de conditions legacy.source
  • BloquantL'opérateur @ ne masque plus les erreurs fatales ; error_reporting par défaut passe à E_ALL et display_startup_errors est activé.source
  • BloquantRetraits : create_function(), each(), __autoload(), casts (real) et (unset), constructeurs PHP 4, constantes insensibles à la casse, appel statique de méthodes non statiques.source
  • BloquantNombreux avertissements promus en exceptions Error/TypeError (écriture sur propriété d'un non-objet, clé de tableau invalide, opérations sur types incompatibles).source
  • À traiterLes erreurs d'héritage liées aux signatures incompatibles (violations de LSP) sont toujours fatales ; l'assertion lève une exception par défaut (assert.exception=1).source

Extensions

  • Plusieurs ressources deviennent des objets (curl_init() renvoie un CurlHandle, etc.) : remplacer les tests is_resource() par des tests contre false.source
  • Mot réservé match ; paramètre optionnel avant un paramètre obligatoire déprécié (la valeur par défaut est ignorée).source

Pièges rencontrés en migration

  • Les gestionnaires d'erreurs qui testaient error_reporting() == 0 pour détecter un @ doivent utiliser un masque (error_reporting() & $err_no), sinon les erreurs masquées remontent.source
  • Avec display_startup_errors activé par défaut et E_ALL, il faut vérifier display_errors=Off en production pour éviter les fuites d'informations.source

Rector : LevelSetList::UP_TO_PHP_80

Guide officiel de migration vers PHP 8.0

Passer à PHP 8.1

  • BloquantPasser null à un paramètre non nullable d'une fonction interne est déprécié (strlen(null), trim(null)…) : source massive d'avertissements.source
  • BloquantLes méthodes internes non finales exigent un type de retour compatible dans les classes filles ; sinon dépréciation, masquable par #[\ReturnTypeWillChange].source

Étape intermédiaire, détaillée sur sa propre page : migration PHP 8.0 → 8.1

À lire sur le blog : Migration PHP 8.1 vers 8.3 : les incompatibilités que personne ne mentionne

Passer à PHP 8.2

  • BloquantLa création de propriétés dynamiques est dépréciée, sauf avec #[\AllowDynamicProperties] ; stdClass reste autorisée. Impact fort sur les entités et DTO hérités.source

Étape intermédiaire, détaillée sur sa propre page : migration PHP 8.1 → 8.2

À lire sur le blog : PHP 8.6 arrive le 19 novembre, PHP 8.2 expire le 31 décembre

Passer à PHP 8.3

  • À traiterIncrémenter ou décrémenter des chaînes vides ou non numériques est déprécié ; utiliser str_increment(). L'incrément de chaînes non numériques est soft-déprécié.source
  • À traiterrange() durci : TypeError pour objets, tableaux et ressources, ValueError pour un pas à 0 ou négatif sur une plage croissante, avertissement pour une chaîne vide.source
  • À traiterAffecter un index négatif $n à un tableau vide fait désormais suivre $n+1 au lieu de 0.source
  • Mineurget_class() et get_parent_class() sans argument sont dépréciées ; assert_options() et les constantes ASSERT_* aussi.source
  • MineurUn programme proche du dépassement de pile peut désormais lever une Error (zend.max_allowed_stack_size, zend.reserved_stack_size).source

Extensions

  • Variante MT_RAND_PHP de Mt19937 dépréciée dans l'extension Random.source
  • mb_strimwidth() avec largeur négative et plusieurs API Phar, LDAP, SQLite3 et Zip sont dépréciées.source

Pièges rencontrés en migration

  • Le calcul de revalidation OPcache évolue : opcache_get_status()['scripts'][n]['revalidate'] contient maintenant un horodatage Unix, ce qui peut casser des outils de monitoring.source
  • Appeler proc_get_status() plusieurs fois renvoie maintenant toujours la bonne valeur (résultat mis en cache sur POSIX) ; la clé 'cached' permet de retrouver l'ancien comportement.source

Rector : LevelSetList::UP_TO_PHP_83

Guide officiel de migration vers PHP 8.3

À lire sur le blog : Migration PHP 8.1 vers 8.3 : les incompatibilités que personne ne mentionne · Docker multi-stage builds : image PHP 8.3 de 800 Mo à 80 Mo

Ce que PHP 8.3 vous apporte

  • 8.3 : Constantes de classe, d'interface, de trait et d'enum typées.source
  • 8.3 : Attribut #[\Override] qui vérifie qu'une méthode existe bien dans le parent ou l'interface implémentée.source
  • 8.3 : Accès dynamique aux constantes de classe avec C::{$name} et initialiseurs de variables statiques arbitraires.source
  • 8.3 : Réinitialisation des propriétés readonly dans __clone() et classes anonymes readonly.source
  • 8.3 : Syntaxe de repli pour les variables ini et closures créées depuis des méthodes magiques acceptant les arguments nommés.source

Combien coûte cette migration ?

À partir de 1 500 € HT

Pour faire migrer votre application avec Bear Upgrade, Rector tourne d’abord en dry-run sur les transformations mécaniques, Claude Code traite les cas que Rector ne couvre pas, puis un développeur senior relit chaque Merge Request. Votre équipe veut reprendre la main ensuite ? Pensez à la formation Claude Code sur vos projets. Exemple concret : la migration Symfony d’un e-commerce bordelais, et après la migration, la maintenance des versions garde le socle à jour.

Sur une base aussi ancienne, l’audit d’abord : Bear Scan mesure tests, dépendances abandonnées et code mort avant de fixer le prix de la migration.

Questions fréquentes

Pour aller plus loin

Sources

Votre migration PHP 7.4 → 8.3, livrée en Merge Requests

CI au vert garantie 7 jours après le merge. Un appel de cadrage suffit pour fixer le périmètre, le prix et le délai.