Aller au contenu principal

Migration PHP · 8.3 → 8.4 → 8.5

Migrer de PHP 8.3 à PHP 8.5

PHP 8.3 reste couvert par les correctifs de sécurité jusqu’en décembre 2027 ; PHP 8.5 reste couvert par les correctifs de sécurité jusqu’en décembre 2029. La montée traverse 2 versions (8.4 et 8.5), chacune avec ses incompatibilités documentées dans le manuel PHP. 1 rupture à fort impact sur le parcours. Première rupture à traiter : paramètre implicitement nullable (Type $p = null) déprécié : écrire ?Type ou Type|null. Touche massivement le code hérité et les dépendances.

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

Support de PHP 8.3 et 8.5
CritèrePHP 8.3PHP 8.5
Sortienovembre 2023novembre 2025
Fin des correctifs de bugsdécembre 2025décembre 2027
Fin des correctifs de sécuritédécembre 2027décembre 2029

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

Les ruptures à traiter en premier

  1. Bloquant · 8.4Paramètre implicitement nullable (Type $p = null) déprécié : écrire ?Type ou Type|null. Touche massivement le code hérité et les dépendances.source
  2. À traiter · 8.4exit() et die() se comportent comme des fonctions : soumis à strict_types et lèvent TypeError pour un type invalide.source
  3. À traiter · 8.5Les alias de casts non canoniques (boolean), (integer), (double) et (binary) sont dépréciés ; l'opérateur backtick est déprécié au profit de shell_exec().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, auditer la dette technique avec Bear Scan chiffre la dette qui ralentira chaque étape.

Passer à PHP 8.4

  • BloquantParamètre implicitement nullable (Type $p = null) déprécié : écrire ?Type ou Type|null. Touche massivement le code hérité et les dépendances.source
  • À traiterexit() et die() se comportent comme des fonctions : soumis à strict_types et lèvent TypeError pour un type invalide.source
  • À traiterLe niveau E_STRICT est supprimé et sa constante déclarée dépréciée ; trigger_error() avec E_USER_ERROR est déprécié.source
  • À traiterModification indirecte de propriétés readonly dans __clone() interdite ; la récursion pendant une comparaison lève une Error.source
  • Mineurround() lève ValueError pour un mode invalide, str_getcsv() exige des séparateurs d'un octet, et nommer une classe _ est déprécié.source

Extensions

  • Migration ressource vers objet pour DBA, ODBC et SOAP.source
  • opcache.interned_strings_buffer : maximum relevé à 32767 sur 64 bits (4095 avant) ; nouveaux avertissements ou exceptions dans curl, gd, intl, mbstring, session, xml.source

Pièges rencontrés en migration

  • Les dépréciations de types implicitement nullables viennent surtout des dépendances : mettre à jour les paquets de vendor/ (composer outdated) avant de basculer la production.source
  • Une API qui passait n'importe quel type à exit() (ex. un tableau ou un objet) échoue désormais en TypeError dans les scripts et commandes console.source

Rector : LevelSetList::UP_TO_PHP_84

Guide officiel de migration vers PHP 8.4

À lire sur le blog : Doctrine ORM 3.4.0 : Lazy Objects natifs PHP 8.4 en production · Docker PHP 8.4 production : multi-stage, non-root et scan Trivy en CI

Passer à PHP 8.5

  • À traiterLes alias de casts non canoniques (boolean), (integer), (double) et (binary) sont dépréciés ; l'opérateur backtick est déprécié au profit de shell_exec().source
  • À traiterUtiliser null comme index de tableau ou dans array_key_exists() est déprécié ; utiliser une chaîne vide.source
  • À traiter__sleep() et __wakeup() sont soft-dépréciées au profit de __serialize()/__unserialize() ; register_argc_argv sur SAPI non CLI est déprécié.source
  • À traiterNouveaux avertissements : cast d'un float hors plage vers int, cast de NAN, et déstructuration d'une valeur non tableau.source
  • MineurLe réglage disable_classes est supprimé ; 'array' et 'callable' ne peuvent plus servir de nom d'alias dans class_alias().source

Extensions

  • OPcache est toujours compilée dans le binaire et chargée ; opcache.enable et opcache.enable_cli restent honorés.source
  • Nouvelle extension uri ; PDO::FETCH_CLASS suit désormais la sémantique de call_user_func_array() pour les arguments du constructeur.source

Pièges rencontrés en migration

  • Un php.ini avec zend_extension=opcache.so ou php_opcache.dll émet maintenant un avertissement : retirer la ligne et conserver opcache.enable.source
  • Le constructeur PDO::FETCH_CLASS suit la sémantique CUFA : les clés de chaîne deviennent des arguments nommés, et le wrapping automatique des arguments par valeur vers un paramètre par référence est supprimé.source

Rector : LevelSetList::UP_TO_PHP_85

Guide officiel de migration vers PHP 8.5

À lire sur le blog : PHP 8.5 en prod : array_first(), backtraces fatales et --ini=diff · PHP 8.5 `clone with` : Value Objects immutables sans boilerplate DDD

Ce que PHP 8.5 vous apporte

  • 8.5 : Opérateur pipe |> pour chaîner des appels de gauche à droite.source
  • 8.5 : Extension URI toujours active, conforme à RFC 3986 et WHATWG URL.source
  • 8.5 : Attribut #[\NoDiscard] et cast (void) pour signaler qu'ignorer un retour est intentionnel.source
  • 8.5 : clone devient une fonction : clone($obj, withProperties: [...]) permet de réassigner des propriétés readonly pendant le clonage.source
  • 8.5 : Closures et callables de première classe autorisés dans les expressions constantes ; backtraces pour les erreurs fatales.source

Combien coûte cette migration ?

À partir de 1 500 € HT

Pour une migration Bear Upgrade livrée en Merge Requests, 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 à former votre équipe à Claude Code. Exemple concret : la migration Symfony d’un e-commerce bordelais, et après la migration, la maintenance des versions garde le socle à jour.

Questions fréquentes

Pour aller plus loin

Sources

Votre migration PHP 8.3 → 8.5, 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.