PHP 8.0 → 8.5 — Guide de compatibilité¶
Référence pratique pour vérifier la compatibilité des modules, addons et projets lors des montées de version PHP. Chaque section liste ce qui casse (breaking) et ce qui arrive (nouveautés utilisables).
Réflexe avant toute montée de version
composer why-not php 8.Xdans le projet → liste les paquets bloquants.- Vérifier les extensions chargées :
php -m(une extension absente en 8.X = fatal). - Tester sur un domaine de staging avant la prod (Plesk permet une version PHP par domaine).
PHP 8.1 (depuis 8.0)¶
Casse potentiellement¶
readonlydevient mot réservé d'usage : des propriétés/méthodes nommées librement restent OK, mais attention aux conflits de style.- Les callables non-statiques en syntaxe string (
"Class::method") sont dépréciés. Serializabledéprécié au profit de__serialize()/__unserialize().- Les fonctions internes lèvent plus volontiers des
TypeErrorsur mauvais types (héritage du strict 8.0). $GLOBALSrestreint : plus de réassignation complète ($GLOBALS = [...]fatal).
Apporte¶
- Enums (
enum Grade: int { ... }) — remplace les constantes de classe éparses. readonlyproperties — parfait pour les DTO.- Fibers (base des futures concurrences, utilisé par les frameworks async).
nevercomme type de retour,newdans les paramètres par défaut initialisers.- Clés de tableau en déstructuration :
[ 'a' => $a ] = $arr.
PHP 8.2 (depuis 8.1)¶
Casse potentiellement¶
- Propriétés dynamiques dépréciées — LE piège n°1 des vieux modules :
Correctif : déclarer la propriété, ou
$obj->proprieteJamaisDeclaree = 'x'; // Deprecated en 8.2, erreur plus tard#[AllowDynamicProperties]sur la classe (rustine temporaire, fréquent dans les vieux addons Microweber/Zend). utf8_encode()/utf8_decode()dépréciées (retirées en 8.5 — voir plus bas).- Interpolation
${var}dans les strings dépréciée → utiliser{$var}.
Apporte¶
- Classes
readonlyentières. - Types DNF (
(A&B)|null). true,false,nullcomme types autonomes.- Constantes dans les traits.
- Extension
randomréorganisée (Random\Randomizer).
PHP 8.3 (depuis 8.2)¶
Casse potentiellement¶
- Peu de casse : version douce. Vérifier surtout :
unserialize()plus strict (E_WARNING au lieu de E_NOTICE sur données corrompues).- Dates : certains formats invalides lèvent désormais des exceptions dans DateTime.
Apporte¶
- Constantes de classe typées :
const string VERSION = '1.0'; #[Override]— attrape les fautes de frappe dans les surcharges (utile dans les addons héritant de classes framework).json_validate()— valider sans décoder (parfait pour les envelopes API).- Clonage readonly amélioré (
__clonepeut réécrire les props readonly).
PHP 8.4 (depuis 8.3)¶
Casse potentiellement¶
- Nullabilité implicite dépréciée — piège n°1 de cette version, partout dans le vieux code :
Grep utile :
function f(string $x = null) {} // Deprecated en 8.4 function f(?string $x = null) {} // Correctfunction .*\w+ \$\w+ = nullsur le code d'un addon avant migration. E_STRICTretiré.- Plusieurs extensions sorties vers PECL (IMAP, pspell, oci8) — vérifier
php -msi un module mail/legacy en dépend.
Apporte¶
- Property hooks (
get/setdans la déclaration) — fin des getters/setters boilerplate. - Visibilité asymétrique :
public private(set) string $etat; newchaînable sans parenthèses :new Classe()->methode().array_find(),array_any(),array_all().- HTML5 parser natif (
Dom\HTMLDocument).
PHP 8.5 (depuis 8.4)¶
Casse potentiellement¶
- Retraits définitifs de fonctions longtemps dépréciées — les vieux addons qui
n'ont jamais été nettoyés cassent ICI :
utf8_encode()/utf8_decode()(→mb_convert_encoding($s, 'UTF-8', 'ISO-8859-1')), et les dépréciations 8.1-8.3 non corrigées passent en erreurs. - Vérifier les modules qui manipulent la config INI à chaud : durcissements divers.
Apporte¶
- Opérateur pipe
|>:$resultat = $donnees |> trim(...) |> strtoupper(...); array_first()/array_last().- Attribut
#[NoDiscard](avertit si une valeur de retour est ignorée). #[DelayedTargetValidation], clonage avec modifications (clone with).- Constantes d'attributs finales, améliorations cURL/DOM.
Tableau de correspondance stack Rebel¶
| Projet / outil | PHP minimum | PHP recommandé | Notes |
|---|---|---|---|
| Laravel 13 + Filament v5 | 8.3 | 8.5 | stack cible des projets récents |
| Microweber (core + addons maison) | 8.1 | 8.2 | attention propriétés dynamiques dans les vieux addons |
| Zend Framework 1 (base APICLI/microweberapi) | 7.x historique | 8.1 avec patchs | dépréciations 8.2+ nombreuses ; isoler la version PHP du vhost |
| Scripts CLI maison (.sh + php) | 8.2 | 8.4+ | profiter de json_validate() |
Par domaine dans Plesk
Plesk permet une version PHP différente par domaine (Domaine → Paramètres PHP). Un addon legacy peut rester en 8.1 pendant que les projets Laravel roulent en 8.5 sur le même serveur.
Commandes de diagnostic rapides¶
# Version CLI et modules chargés
php -v && php -m
# Dépréciations d'un projet (composer)
composer why-not php 8.5
# Scanner un addon pour les pièges 8.2/8.4 (grep grossier mais efficace)
grep -rn '\${[a-zA-Z_]' src/ # interpolation dépréciée
grep -rnE '= null\)' src/ | grep -v '?' # nullabilité implicite
grep -rn 'utf8_encode\|utf8_decode' src/