Où en est le support de PHP 8.0 et 8.5 ?
| Critère | PHP 8.0 | PHP 8.5 |
|---|---|---|
| Sortie | novembre 2020 | novembre 2025 |
| Fin des correctifs de bugs | novembre 2022 | décembre 2027 |
| Fin des correctifs de sécurité | novembre 2023 | décembre 2029 |
Statuts vérifiés le 08/11/2026 sur les pages officielles de version.
Les ruptures à traiter en premier
- 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
- Bloquant · 8.1Les méthodes internes non finales exigent un type de retour compatible dans les classes filles ; sinon dépréciation, masquable par #[\ReturnTypeWillChange].source
- Bloquant · 8.2La 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
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.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
- BloquantMySQLi : le mode d'erreur par défaut passe de silencieux à exceptions ; restauration possible avec mysqli_report(MYSQLI_REPORT_OFF).source
- À traiterConversions implicites float vers int avec perte de précision dépréciées (clés de tableau, types int en mode coercitif, opérateurs).source
- À traiterSerializable sans __serialize()/__unserialize() est déprécié ; strftime(), strptime() et date_sunrise() aussi.source
Extensions
- Migration ressource vers objet pour finfo, FTP, IMAP, LDAP, pgsql et autres extensions.source
- PDO::ATTR_STRINGIFY_FETCHES transforme désormais les booléens en '0' ou '1' ; le chiffrement par défaut d'openssl_encrypt passe de RC2-40 à AES-128-CBC.source
Pièges rencontrés en migration
- Le mode exceptions de MySQLi peut transformer en erreur fatale du code qui ignorait silencieusement les échecs de requête ; auditer les appels avant déploiement.source
- Les bibliothèques tierces non à jour inondent les logs de dépréciations de types de retour ; vérifier les versions de vendor/ avant la bascule.source
Rector : LevelSetList::UP_TO_PHP_81
Guide officiel de migration vers PHP 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
Étape intermédiaire, détaillée sur sa propre page : migration PHP 8.2 → 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
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
Étape intermédiaire, détaillée sur sa propre page : migration PHP 8.3 → 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 à 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.
Questions fréquentes
À traiter en premier : Passer null à un paramètre non nullable d'une fonction interne est déprécié (strlen(null), trim(null)…) : source massive d'avertissements (PHP 8.1) ; Les méthodes internes non finales exigent un type de retour compatible dans les classes filles ; sinon dépréciation, masquable par #[\ReturnTypeWillChange] (PHP 8.1) ; La 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 (PHP 8.2).
PHP 8.0 ne reçoit plus de correctifs de sécurité depuis novembre 2023.
En grande partie : le set LevelSetList::UP_TO_PHP_85 applique en une passe les transformations mécaniques jusqu’à PHP 8.5. Restent les changements de comportement (valeurs de retour, erreurs devenues fatales, extensions retirées), à couvrir par les tests et une relecture humaine.
Une migration Bear Upgrade démarre à 1 500 € HT. Pour une application Symfony, le calculateur pré-rempli avec PHP 8.0 → 8.5 donne l’estimation de votre projet ; le prix ferme est fixé au cadrage.
Pour aller plus loin
- PHP 8.6 arrive le 19 novembre, PHP 8.2 expire le 31 décembre
- PHP 8.5 en prod : array_first(), backtraces fatales et --ini=diff
- PHP 8.5 `clone with` : Value Objects immutables sans boilerplate DDD
- Migration PHP 8.1 vers 8.3 : les incompatibilités que personne ne mentionne
- PHP 8.5 : pipe operator, extension URI et #[NoDiscard] avant la GA
Sources
- www.php.net/manual/en/migration81.deprecated.php
- www.php.net/manual/en/migration81.incompatible.php
- www.php.net/manual/en/migration82.deprecated.php
- www.php.net/manual/en/migration83.deprecated.php
- www.php.net/manual/en/migration83.incompatible.php
- www.php.net/manual/en/migration84.deprecated.php
- www.php.net/manual/en/migration85.deprecated.php
- www.php.net/manual/en/migration85.incompatible.php