Menu
Coddy logo textTech

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.99

En 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.

challenge icon

Défi

Facile

Construisons 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 classe Contact en 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"
    Utilisez la syntaxe de promotion de constructeur — aucune déclaration de propriété séparée n'est nécessaire ! Ajoutez une méthode publique getFullDetails() qui retourne "[name] | [email] | [phone]". Ajoutez également une méthode getSummary() qui retourne "Contact: [name]".
  • 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 de Contact :
    • 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)
    Affichez quatre lignes :
    • 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

?>
quiz iconTestez-vous

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