# Migrer un thème vers PHP 8.1 : les propriétés dynamiques à corriger en avance

> PHP 8.2 dépréciera les propriétés dynamiques de classe, mais un thème tournant déjà sous PHP 8.1 gagne à corriger ces motifs dès maintenant plutôt que d'attendre l'alerte officielle.

- Auteur : WordPress Développement
- Publié le : 2022-09-16
- Mis à jour le : 2022-09-16
- Catégorie : Thèmes
- URL : https://www.wpmoderne.fr/themes/migrer-theme-php81-proprietes-dynamiques/

## L’essentiel

- PHP 8.2 déclenchera une dépréciation sur toute propriété non déclarée
- Repérer les motifs à risque dès PHP 8.1 évite une correction dans l'urgence
- #[AllowDynamicProperties] existe mais reste un correctif temporaire

PHP 8.2, prévu pour la fin de l'année, dépréciera officiellement les propriétés dynamiques de classe : toute propriété assignée à un objet sans avoir été déclarée dans sa classe déclenchera un avertissement de dépréciation. Un thème qui tourne aujourd'hui sous PHP 8.1 gagne à traiter ce sujet en avance plutôt que d'attendre la sortie de la version suivante pour découvrir des dizaines de notices d'un coup dans les logs de production.

Sur un thème sur mesure construit autour de plusieurs classes PHP orientées objet (gestion de types de contenu personnalisés, classes utilitaires), un premier passage de repérage a permis d'anticiper cette dépréciation avant qu'elle ne devienne bloquante pour les clients encore sous PHP 8.1 aujourd'hui, et sous 8.2 demain.

## Qu'est-ce qu'une propriété dynamique

Une propriété dynamique est une propriété assignée à un objet sans avoir été déclarée dans la définition de sa classe. Ce motif, parfaitement toléré jusqu'à PHP 8.1, ressemble à ceci :

```
class Mon_Widget_Personnalise {
    public function __construct( $titre ) {
        $this->titre = $titre;
        $this->actif = true;
    }
}
```

Si `$titre` et `$actif` ne figurent pas dans une déclaration `public $titre;` ou `public $actif;` en tête de classe, PHP les crée dynamiquement à la volée. Ce comportement, longtemps considéré comme une simple souplesse du langage, devient une source de dépréciation à partir de PHP 8.2.

## Repérer les motifs à risque

Une recherche ciblée sur les assignations `$this->` suivies d'un nom de propriété permet un premier repérage manuel, avant vérification classe par classe :

```
grep -rn '\$this->[a-zA-Z_]* =' wp-content/themes/mon-theme/inc/
```

Sur ce thème, cette recherche a remonté 22 occurrences réparties sur 6 classes, dont la majorité concernait des propriétés jamais déclarées explicitement, assignées uniquement depuis le constructeur ou depuis des méthodes appelées après l'instanciation.

> L'essentiel à retenir : PHP 8.2 déclenchera une dépréciation sur toute propriété non déclarée ; Repérer les motifs à risque dès PHP 8.1 évite une correction dans l'urgence ; #[AllowDynamicProperties] existe mais reste un correctif temporaire

## Correctif : déclarer explicitement chaque propriété

La correction consiste à déclarer chaque propriété en tête de classe, avec si possible un typage explicite, ce qui a l'avantage supplémentaire de documenter la structure de la classe pour la prochaine personne qui la reprendra :

```
class Mon_Widget_Personnalise {
    public string $titre;
    public bool $actif;

    public function __construct( string $titre ) {
        $this->titre = $titre;
        $this->actif = true;
    }
}
```

## Cas particulier : les propriétés ajoutées après coup

Certaines classes du thème recevaient des propriétés assignées bien après l'instanciation, depuis un hook externe, un motif plus difficile à repérer par simple lecture du fichier de la classe :

```
$widget = new Mon_Widget_Personnalise( 'Actualités' );
$widget->source_donnees = 'flux-rss'; // propriété jamais déclarée dans la classe
```

Ce genre d'assignation externe, souvent ajoutée lors d'une évolution ultérieure du thème sans revenir modifier la classe d'origine, nécessite une revue plus large que le seul contenu du fichier de classe : une recherche du nom de la classe dans l'ensemble du thème permet de repérer ces assignations distantes.

## Le correctif de repli : AllowDynamicProperties

Pour les classes issues de bibliothèques tierces qu'il n'est pas possible de modifier directement, PHP 8.2 introduit l'attribut `#[AllowDynamicProperties]`, qui désactive la dépréciation pour la classe concernée :

```
#[AllowDynamicProperties]
class Classe_Bibliotheque_Tierce {
    // ...
}
```

Ce correctif reste un pis-aller à réserver aux cas où la modification directe de la classe n'est pas envisageable dans l'immédiat, pas une solution à généraliser sur l'ensemble du code du thème.

## Checklist avant migration

- Répertorier toutes les classes PHP du thème et de ses dépendances internes.
- Rechercher les assignations `$this->propriete =` non précédées d'une déclaration explicite.
- Rechercher également les assignations externes sur des instances déjà créées.
- Déclarer chaque propriété identifiée, avec un typage explicite quand c'est possible.
- Réserver `#[AllowDynamicProperties]` aux seules classes tierces non modifiables directement.

## En résumé

Corriger les propriétés dynamiques d'un thème avant la dépréciation officielle de PHP 8.2 évite une découverte massive de notices en production, et documente au passage la structure réelle des classes du thème. Ce travail, mené en avance plutôt que dans l'urgence, ne demande qu'une recherche méthodique et des déclarations de propriétés qui auraient dû figurer là dès l'origine.
