Aller au contenu

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

  1. composer why-not php 8.X dans le projet → liste les paquets bloquants.
  2. Vérifier les extensions chargées : php -m (une extension absente en 8.X = fatal).
  3. Tester sur un domaine de staging avant la prod (Plesk permet une version PHP par domaine).

PHP 8.1 (depuis 8.0)

Casse potentiellement

  • readonly devient 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.
  • Serializable déprécié au profit de __serialize()/__unserialize().
  • Les fonctions internes lèvent plus volontiers des TypeError sur mauvais types (héritage du strict 8.0).
  • $GLOBALS restreint : plus de réassignation complète ($GLOBALS = [...] fatal).

Apporte

  • Enums (enum Grade: int { ... }) — remplace les constantes de classe éparses.
  • readonly properties — parfait pour les DTO.
  • Fibers (base des futures concurrences, utilisé par les frameworks async).
  • never comme type de retour, new dans 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 :
    $obj->proprieteJamaisDeclaree = 'x'; // Deprecated en 8.2, erreur plus tard
    
    Correctif : déclarer la propriété, ou #[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 readonly entières.
  • Types DNF ((A&B)|null).
  • true, false, null comme types autonomes.
  • Constantes dans les traits.
  • Extension random ré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é (__clone peut 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 :
    function f(string $x = null) {}      // Deprecated en 8.4
    function f(?string $x = null) {}     // Correct
    
    Grep utile : function .*\w+ \$\w+ = null sur le code d'un addon avant migration.
  • E_STRICT retiré.
  • Plusieurs extensions sorties vers PECL (IMAP, pspell, oci8) — vérifier php -m si un module mail/legacy en dépend.

Apporte

  • Property hooks (get/set dans la déclaration) — fin des getters/setters boilerplate.
  • Visibilité asymétrique : public private(set) string $etat;
  • new chaî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/