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
) {}
}

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.0dans 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.