Aller au contenu principal

Migration PHP · 5.6 → 7.0 → 7.1 → 7.2 → 7.3 → 7.4

Migrer de PHP 5.6 à PHP 7.4

PHP 5.6 ne reçoit plus de correctifs de sécurité depuis décembre 2018 ; PHP 7.4 ne reçoit plus de correctifs de sécurité depuis novembre 2022. La montée traverse 5 versions (7.0, 7.1, 7.2, 7.3 et 7.4), chacune avec ses incompatibilités documentées dans le manuel PHP. 7 ruptures à fort impact sur le parcours. Première rupture à traiter : beaucoup d'erreurs fatales deviennent des exceptions Error ; un set_exception_handler() typé Exception provoque une erreur fatale si une Error est levée.

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

Support de PHP 5.6 et 7.4
CritèrePHP 5.6PHP 7.4
Sortieaoût 2014novembre 2019
Fin des correctifs de bugsjanvier 2017novembre 2021
Fin des correctifs de sécuritédécembre 2018novembre 2022

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

Les ruptures à traiter en premier

  1. Bloquant · 7.0Beaucoup d'erreurs fatales deviennent des exceptions Error ; un set_exception_handler() typé Exception provoque une erreur fatale si une Error est levée.source
  2. Bloquant · 7.0Retrait de toutes les fonctions ext/mysql (mysql_*) : il faut migrer vers mysqli ou PDO.source
  3. Bloquant · 7.1Appeler une fonction utilisateur avec trop peu d'arguments lève désormais ArgumentCountError (Error) au lieu d'un simple avertissement.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 7.0

  • BloquantBeaucoup d'erreurs fatales deviennent des exceptions Error ; un set_exception_handler() typé Exception provoque une erreur fatale si une Error est levée.source
  • BloquantRetrait de toutes les fonctions ext/mysql (mysql_*) : il faut migrer vers mysqli ou PDO.source
  • BloquantRetrait des fonctions ereg* (remplacées par PCRE) et de preg_replace() avec le modificateur /e, à remplacer par preg_replace_callback().source
  • À traiterLes erreurs de syntaxe lèvent ParseError : tout eval() doit gérer cette exception.source
  • À traiterL'évaluation des variables indirectes passe en strict gauche-droite : $$foo['bar']['baz'] devient ($$foo)['bar']['baz'], à corriger avec des accolades.source

Extensions

  • Extensions retirées : ereg, mssql, mysql et sybase_ct ; SAPI Apache 1 (apache, apache_hooks) et plusieurs SAPI obsolètes supprimés.source
  • L'extension JSON est remplacée par JSOND : un nombre ne peut plus finir par un point (34.) et une chaîne vide n'est plus du JSON valide.source

Pièges rencontrés en migration

  • foreach par valeur travaille sur une copie du tableau : les modifications faites pendant l'itération ne sont plus vues, ce qui change le comportement de boucles qui ajoutaient des éléments.source
  • list() assigne désormais dans l'ordre de déclaration : list($a[], $a[], $a[]) inverse son résultat par rapport à PHP 5.source

Rector : LevelSetList::UP_TO_PHP_70

Guide officiel de migration vers PHP 7.0

Passer à PHP 7.1

  • BloquantAppeler une fonction utilisateur avec trop peu d'arguments lève désormais ArgumentCountError (Error) au lieu d'un simple avertissement.source

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

Passer à PHP 7.2

  • Bloquantcount() sur une valeur non dénombrable (null, scalaire, objet non Countable) émet un E_WARNING ; très fréquent dans le code hérité de PHP 5.source
  • Bloquanteach() est dépréciée : à remplacer par foreach ou ArrayIterator.source

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

Passer à PHP 7.3

  • À traiterAvec le heredoc flexible, un marqueur de fin apparaissant dans le corps (même indenté) termine la chaîne et peut provoquer une erreur de syntaxe.source
  • À traitercontinue ciblant un switch émet un avertissement : il se comporte comme break, alors que d'autres langages le traitent comme continue 2.source

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

Passer à PHP 7.4

  • À traiterAccéder à null, bool, int, float ou resource comme à un tableau ($null['key']) génère désormais une notice.source
  • À traiterfn devient un mot réservé : il ne peut plus nommer une fonction ou une classe (reste possible pour une méthode ou une constante de classe).source
  • À traiterTernaires imbriqués sans parenthèses explicites et accès par accolades $var{$idx} sur tableaux et chaînes sont dépréciés.source
  • À traiterimplode() avec l'ordre historique des paramètres (tableau, séparateur) est déprécié ; money_format(), le cast (real) et is_real() aussi.source
  • À traiterLes constantes PASSWORD_* deviennent des chaînes ('2y', 'argon2i') au lieu d'entiers ; le code qui compare ou stocke l'entier doit être revu.source

Extensions

  • Nouvelle extension FFI pour appeler des bibliothèques C natives depuis PHP.source
  • get_magic_quotes_gpc() et get_magic_quotes_runtime() sont dépréciées (renvoient toujours false).source

Pièges rencontrés en migration

  • Le préchargement OPcache (opcache.preload) fige les classes en mémoire jusqu'au redémarrage de PHP-FPM : un déploiement sans redémarrage garde l'ancien code.source
  • Les propriétés typées non initialisées lèvent une Error à la lecture ; l'introduction de types sur un modèle hydraté par un ORM demande des valeurs par défaut ou une initialisation.source

Rector : LevelSetList::UP_TO_PHP_74

Guide officiel de migration vers PHP 7.4

Ce que PHP 7.4 vous apporte

  • 7.4 : Propriétés typées : les propriétés de classe acceptent une déclaration de type appliquée à chaque affectation.source
  • 7.4 : Fonctions fléchées (fn) avec liaison implicite du scope par valeur.source
  • 7.4 : Covariance limitée des types de retour et contravariance des types d'arguments, avec autoloading.source
  • 7.4 : Opérateur d'affectation null coalescent (??=), décompression dans les tableaux (...), séparateur numérique 1_000.source
  • 7.4 : Préchargement du code dans OPcache (preloading), extension FFI et WeakReference.source

Combien coûte cette migration ?

À partir de 1 500 € HT

Pour la migration accompagnée 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 5.6 → 7.4, 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.