De PHP 7.4 à 8.5 : ce qui change, ce qui casse.

Sept versions séparent 7.4 de 8.5. Les ruptures se concentrent sur 8.0, 8.1 et 8.2 ; la suite est surtout faite d’avertissements. Voici la carte.

La carte du voyage

VersionSortieCe qui pose problème
PHP 8.0nov. 2020Notices devenues warnings (clé de tableau absente, variable non définie) ; comparaison chaîne/nombre modifiée (0 == "abc" est maintenant faux) ; fonctions retirées (each(), create_function(), money_format()) ; TypeError sur les arguments invalides des fonctions internes.
PHP 8.1nov. 2021null passé à un paramètre non nullable d’une fonction interne (déprécié) ; conversion float vers int avec perte ; strftime() et FILTER_SANITIZE_STRING dépréciés ; méthodes d’interfaces internes sans type de retour.
PHP 8.2déc. 2022Propriétés dynamiques dépréciées ; utf8_encode() et utf8_decode() dépréciées ; interpolation ${var} dépréciée.
PHP 8.3nov. 2023Peu de ruptures, quelques dépréciations mineures.
PHP 8.4nov. 2024Types nullables implicites dépréciés (function f(Foo $x = null)).
PHP 8.5nov. 2025Dépréciations : opérateur backtick, noms de casts non canoniques ((integer), (boolean), (double)). Nouveautés : opérateur pipe |>, array_first() et array_last(), extension URI.

Cette liste est un résumé. Pour un chantier précis, le guide de migration de chaque version sur php.net reste la référence à relire.

Quatre cassures typiques, en code

PHP 8.0 : la fonction a disparu

// Fatal error : Call to undefined function each()
while (list($k, $v) = each($items)) { /* … */ }

// Correction
foreach ($items as $k => $v) { /* … */ }

PHP 8.1 : null vers une fonction interne

// Deprecated : Passing null to parameter #1 ($string)
$title = trim($_POST['title']);   // champ absent : null

// Correction
$title = trim($_POST['title'] ?? '');

PHP 8.2 : propriété dynamique

// Deprecated : Creation of dynamic property Order::$total
class Order {}
$o = new Order();
$o->total = 42;

// Correction
class Order { public float $total = 0.0; }

PHP 8.4 : type nullable implicite

// Deprecated : Implicitly marking parameter $x as nullable
function save(Product $x = null) {}

// Correction
function save(?Product $x = null) {}

Les outils qui font une grande partie du travail

  • Rector réécrit automatiquement le code pour les montées de version (jeux de règles par version de PHP).
  • PHPStan analyse le code sans l’exécuter et repère les appels invalides, les types incohérents et le code mort.
  • PHP_CodeSniffer + PHPCompatibility liste les constructions incompatibles avec une version donnée.
  • Composer dit si vos dépendances suivent : la commande composer why-not php 8.5 indique ce qui bloque.
composer require --dev rector/rector phpstan/phpstan
vendor/bin/rector process src --dry-run
vendor/bin/phpstan analyse src --level=5
composer why-not php 8.5

Ces outils trouvent beaucoup, pas tout : le code qui construit des noms de fonctions ou de classes dynamiquement leur échappe. D’où l’intérêt de parcourir aussi le site réel sur une copie, en lisant les journaux.

Un seul saut ou plusieurs étapes ?

Pour un petit site, passer directement de 7.4 à 8.5 sur la copie de test et lire les erreurs fonctionne bien. Pour une grosse base de code, monter version par version (8.0, puis 8.1, puis 8.2…) isole mieux les problèmes : à chaque palier, on sait quelle version a provoqué quelle erreur.

Dans les deux cas, ne le faites jamais directement sur le site en ligne.

Questions fréquentes

Peut-on sauter de 7.4 à 8.5 directement ?

Techniquement oui, sur une copie. Sur un projet important, il vaut mieux passer par des paliers pour savoir quelle version a causé quelle erreur. Le choix dépend de la taille du code et du nombre de dépendances.

PHP 8.5 est-il utilisable en production ?

Oui. Elle est sortie en novembre 2025 et reçoit des correctifs de sécurité jusqu’au 31 décembre 2029. Vérifiez simplement que vos extensions et dépendances la supportent, c’est le rôle de l’audit.

Le site sera-t-il plus rapide ?

Souvent un peu, parfois sensiblement sur du code PHP lourd. Mais ce n’est pas la raison principale de migrer : c’est la sécurité et la durée de vie du site.

on en parle ?

Dites-moi quel site, je vous dis ce qu’il faut.

Demander un audit