Promotion de constructeur (8.0)
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 42 sur 91.
PHP 8.0 a introduit la promotion de propriété de constructeur, une fonctionnalité qui réduit considérablement le code répétitif (boilerplate) lors de la définition de classes. Au lieu de déclarer les propriétés séparément puis de les assigner dans le constructeur, vous pouvez faire les deux en une seule étape.
Voici l'approche traditionnelle que vous avez utilisée :
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
Avec la promotion de constructeur, vous ajoutez le modificateur d'accès directement aux paramètres du constructeur :
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
$product = new Product("Laptop", 999.99);
echo $product->getInfo();
Sortie :
Laptop: $999.99En ajoutant private, protected ou public avant un paramètre de constructeur, PHP crée automatiquement la propriété et lui assigne la valeur. Vous pouvez mélanger des paramètres promus et des paramètres classiques dans le même constructeur, et vous pouvez toujours ajouter de la logique à l'intérieur du corps du constructeur si nécessaire.
Point clé : La promotion de constructeur élimine les déclarations et affectations de propriétés répétitives, rendant vos classes plus propres et plus faciles à lire tout en conservant un contrôle total sur l'encapsulation.
Défi
FacileConstruisons un système de gestion de contacts qui met en valeur l'élégance de la promotion de constructeur (constructor promotion). Vous allez créer une classe PHP propre et moderne qui élimine le code répétitif tout en maintenant une encapsulation appropriée.
Vous organiserez votre code sur deux fichiers :
Contact.php— Créez une classeContacten utilisant la promotion de constructeur pour définir toutes les propriétés directement dans la signature du constructeur. Votre contact doit avoir :- Une propriété privée
$name(string) - Une propriété privée
$email(string) - Une propriété privée
$phone(string) avec une valeur par défaut de"Not provided"
getFullDetails()qui retourne"[name] | [email] | [phone]". Ajoutez également une méthodegetSummary()qui retourne"Contact: [name]".- Une propriété privée
main.php— Incluez le fichier Contact. Vous recevrez trois entrées : un nom, un e-mail et un numéro de téléphone. Créez deux instances deContact:- Le premier contact doit utiliser les trois valeurs (nom, e-mail et téléphone)
- Le second contact doit utiliser uniquement le nom et l'e-mail (en s'appuyant sur la valeur par défaut du téléphone)
- Les détails complets (full details) du premier contact
- Le résumé (summary) du premier contact
- Les détails complets (full details) du second contact
- Le résumé (summary) du second contact
Remarquez comment la promotion de constructeur vous permet de définir des propriétés, de définir leur visibilité, de déclarer leurs types et d'assigner des valeurs — le tout dans une seule signature de constructeur lisible. Le paramètre optionnel phone avec une valeur par défaut démontre que les paramètres promus fonctionnent parfaitement avec les valeurs par défaut, tout comme les paramètres réguliers.
Aide-mémoire
PHP 8.0 a introduit la promotion de constructeur (constructor promotion), qui vous permet de déclarer et d'initialiser des propriétés de classe directement dans les paramètres du constructeur en ajoutant un modificateur d'accès.
Approche traditionnelle :
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
}
Avec la promotion de constructeur :
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
}
$product = new Product("Laptop", 999.99);
En ajoutant private, protected, ou public avant un paramètre du constructeur, PHP crée automatiquement la propriété et lui assigne la valeur.
Vous pouvez utiliser des valeurs par défaut avec les paramètres promus :
<?php
class Contact {
public function __construct(
private string $name,
private string $email,
private string $phone = "Not provided"
) {}
}
La promotion de constructeur peut être mélangée avec des paramètres réguliers, et vous pouvez toujours ajouter de la logique à l'intérieur du corps du constructeur si nécessaire.
Essayez vous-même
<?php
require_once 'Contact.php';
// Lire l'entrée
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: Créer le premier contact avec les trois valeurs (nom, email, téléphone)
// TODO: Créer le deuxième contact avec seulement le nom et l'email (utiliser le téléphone par défaut)
// TODO: Afficher les détails complets du premier contact
// TODO: Afficher le résumé du premier contact
// TODO: Afficher les détails complets du deuxième contact
// TODO: Afficher le résumé du deuxième contact
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie