Le WordPress d'aujourd'hui, décodé pour les développeurs

Extensions

La promotion de propriétés du constructeur pour raccourcir vos services

Une classe de service à quatre dépendances s'écrit en dix lignes de moins grâce à la promotion de propriétés du constructeur apportée par PHP 8.

Par WordPress Développement • 25 janvier 2021 • 4 min de lecture • Aucun commentaire
La promotion de propriétés du constructeur pour raccourcir vos services

public function __construct( Logger $logger, Cache $cache ) suivi de deux lignes d’affectation identiques à la déclaration : ce schéma s’est répété des milliers de fois dans le code PHP orienté objet, y compris dans les extensions WordPress les plus soignées. PHP 8, sorti fin novembre 2020, propose enfin un moyen de s’en passer.

La promotion de propriétés du constructeur permet de déclarer une propriété de classe directement dans la signature du constructeur, en lui ajoutant un modificateur de visibilité. PHP se charge alors, automatiquement, de créer la propriété et de l’affecter avec la valeur reçue en paramètre. Ce changement de syntaxe ne modifie rien au comportement du code, mais réduit sensiblement sa longueur et, plus important encore, son bruit visuel.

Avant et après, sur un exemple concret

Prenons une classe de service chargée d’envoyer une notification à un client, avec quatre dépendances injectées : un client HTTP, un gabarit d’email, un journal et un dépôt de préférences utilisateur. Voici la version classique, telle qu’on l’écrivait avant PHP 8 :

class ServiceNotification {
    private ClientHttp $client;
    private GabaritEmail $gabarit;
    private Journal $journal;
    private DepotPreferences $preferences;

    public function __construct(
        ClientHttp $client,
        GabaritEmail $gabarit,
        Journal $journal,
        DepotPreferences $preferences
    ) {
        $this->client = $client;
        $this->gabarit = $gabarit;
        $this->journal = $journal;
        $this->preferences = $preferences;
    }
}

Et voici la même classe avec la promotion de propriétés :

class ServiceNotification {
    public function __construct(
        private ClientHttp $client,
        private GabaritEmail $gabarit,
        private Journal $journal,
        private DepotPreferences $preferences
    ) {}
}
L'essentiel à retenir : PHP 8 fusionne déclaration et affectation en un seul endroit ; La visibilité se déclare directement dans la signature ; Le gain de lisibilité dépasse le simple gain de lignes

Ce que PHP fait réellement derrière ce raccourci

Ajouter un modificateur de visibilité (private, protected ou public) devant un paramètre de constructeur indique à PHP de générer, à la compilation, une propriété de classe correspondante et d’y affecter automatiquement la valeur reçue. Le corps du constructeur reste vide dans l’exemple ci-dessus parce qu’il n’y a rien d’autre à faire — mais rien n’empêche d’y ajouter une logique supplémentaire si un traitement est nécessaire après l’affectation.

Une limite à connaître : la validation dans le constructeur

La promotion fonctionne bien tant que le constructeur se contente d’affecter des dépendances. Dès qu’une validation est nécessaire avant affectation — vérifier qu’un montant est positif, par exemple —, il faut soit garder un paramètre classique pour cette propriété et valider dans le corps du constructeur, soit valider dans le type lui-même via un objet-valeur dédié. Mélanger propriétés promues et validation lourde dans le même constructeur nuit rapidement à la lisibilité que cette syntaxe est censée apporter.

Compatibilité avec les extensions existantes

Cette syntaxe nécessite PHP 8.0 au minimum. Une extension qui vise encore une compatibilité avec PHP 7.4 ne peut pas l’utiliser sans casser l’activation sur les hébergements les plus anciens. Il est donc indispensable de vérifier, dans l’en-tête du fichier principal, la version minimale annoncée (Requires PHP) avant d’adopter cette écriture dans le code d’une extension destinée à un public large.

  • Vérifier la ligne Requires PHP: 8.0 dans l’en-tête de l’extension.
  • Réserver la promotion aux classes de service internes, pas aux classes exposées à d’autres extensions tierces encore compatibles PHP 7.4.
  • Documenter le changement dans le changelog technique, car il modifie la signature affichée par un outil d’analyse statique.

Un constructeur qui ne fait qu’affecter des dépendances n’a rien à raconter — autant que sa syntaxe le dise en une ligne plutôt qu’en dix.

En résumé

La promotion de propriétés du constructeur n’ajoute aucune capacité nouvelle au langage : elle supprime une redondance que PHP imposait depuis toujours entre déclaration de propriété et affectation dans le constructeur. Pour une classe de service à quatre dépendances, le gain se compte en une dizaine de lignes, mais surtout en une lecture immédiate des dépendances réelles d’une classe, sans avoir à parcourir le corps du constructeur pour les retrouver.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi