Un e-mail générique de l’hébergeur mutualisé, annonçant que « la version PHP par défaut passera à 8.1 le mois prochain sauf configuration contraire », a suffi à déclencher un audit préventif complet sur l’ensemble d’un parc de soixante sites clients. Ce genre de bascule automatique, fréquente chez les hébergeurs mutualisés qui alignent leurs comptes sur la dernière version stable pour des raisons de support, ne laisse souvent que quelques semaines de préavis avant application effective.
Sur PHP 8.1, plusieurs changements de comportement, introduits en continuité de PHP 8.0, créent des erreurs de compatibilité sur des extensions ou du code personnalisé qui fonctionnaient sans problème jusque-là. Voici, classées par impact réel observé sur ce parc, les erreurs rencontrées et comment les anticiper avant que l’hébergeur n’impose la bascule.
Impact fort : les propriétés dynamiques dépréciées
PHP 8.1 introduit une dépréciation des propriétés dynamiques sur les classes qui n’étendent pas stdClass et qui n’implémentent pas __get et __set. Du code ancien qui assigne une propriété non déclarée directement sur un objet génère désormais un avertissement de dépréciation, visible si WP_DEBUG_DISPLAY est activé, ce qui casse visuellement certaines pages en environnement de test.
class Commande_Client {
public $montant;
}
$commande = new Commande_Client();
$commande->statut = 'payee'; // Propriété non déclarée : dépréciation en 8.1
Sur ce parc, cette erreur est apparue sur trois extensions maison anciennes, corrigées en déclarant explicitement chaque propriété utilisée dans la classe concernée.
Impact modéré : les callables sous forme de chaîne

Certains hooks WordPress anciens, notamment dans des thèmes développés avant l’adoption généralisée des closures, utilisent des callables sous forme de chaîne de caractères combinée à une syntaxe de classe statique aujourd’hui dépréciée. PHP 8.1 émet un avertissement, sans casser l’exécution dans la majorité des cas, mais ce comportement doit être surveillé de près, certaines futures versions de PHP pouvant durcir ce traitement.
add_action( 'init', 'Mon_Theme::initialiser' ); // Syntaxe à moderniser
add_action( 'init', array( 'Mon_Theme', 'initialiser' ) ); // Forme robuste
Impact faible mais fréquent : le tri de tableaux avec des valeurs nulles
Plusieurs extensions de filtrage de produits WooCommerce ancienne génération utilisaient des fonctions de tri de tableau (usort, uasort) avec des callbacks qui retournaient parfois une valeur nulle implicite en cas de comparaison incomplète. PHP 8.1 traite ce cas plus strictement, générant des avertissements en cascade sur les pages de catalogue produit les plus chargées en filtres.
- Vérifier chaque callback de tri personnalisé pour garantir un retour entier explicite dans tous les cas
- Prêter une attention particulière aux extensions de filtre à facettes, souvent concernées
- Tester la page catalogue avec le nombre maximal de filtres actifs simultanément
La méthode d’audit appliquée sur le parc
Chaque site du parc a été dupliqué sur un environnement de test avec PHP 8.1 déjà actif, puis parcouru avec WP_DEBUG_LOG activé pendant une navigation type reproduisant les parcours les plus fréquents (catalogue, panier, back-office). Le fichier debug.log généré a ensuite été analysé pour repérer les occurrences des trois familles d’erreurs décrites plus haut, avant correction ciblée extension par extension.
Un audit de compatibilité PHP réalisé site par site, plutôt qu’une vérification générique sur un seul environnement de référence, reste la seule méthode fiable sur un parc hétérogène où chaque client utilise sa propre combinaison d’extensions et de personnalisations.
En résumé
La bascule vers PHP 8.1 imposée par un hébergeur mutualisé révèle typiquement trois familles de régressions sur un parc de sites clients anciens : propriétés dynamiques dépréciées, callables sous forme de chaîne obsolète et callbacks de tri insuffisamment stricts. Un audit préventif site par site, mené sur un environnement de test avant la date de bascule annoncée, permet de corriger ces points sans qu’aucun client ne découvre l’incident en pleine navigation sur son propre site.