Menu
Coddy logo textTech

Utilisation de plusieurs traits

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 52 sur 91.

Un seul trait est utile, mais la véritable puissance apparaît lorsque vous combinez plusieurs traits dans une seule classe. PHP vous permet d’inclure autant de traits que nécessaire, ce qui confère à votre classe des fonctionnalités provenant de plusieurs sources à la fois.

Pour utiliser plusieurs traits, il suffit de les énumérer en les séparant par des virgules après le mot-clé use :

<?php
trait Timestampable {
    public function getTimestamp(): string {
        return date('Y-m-d H:i:s');
    }
}

trait Identifiable {
    private string $id;
    
    public function generateId(): void {
        $this->id = uniqid('id_');
    }
    
    public function getId(): string {
        return $this->id;
    }
}

class Post {
    use Timestampable, Identifiable;
    
    public function __construct(public string $title) {
        $this->generateId();
    }
}

$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();

Sortie :

id_6789abc123 - 2024-01-15 10:30:00

La classe Post possède maintenant des méthodes provenant des deux traits. Chaque trait apporte sa propre fonctionnalité : Timestampable fournit des méthodes liées au temps, tandis que Identifiable gère les identifiants uniques. Cette approche permet à chaque trait de se concentrer sur une seule responsabilité, rendant votre code plus modulaire et réutilisable.

Que se passe-t-il lorsque deux traits ont des méthodes portant le même nom ? C’est une situation de conflit que nous explorerons dans la prochaine leçon.

challenge icon

Défi

Facile

Construisons un système de gestion des produits qui combine plusieurs traits afin de donner aux produits des fonctionnalités de tarification et de gestion des stocks. Chaque trait prendra en charge une seule responsabilité, et votre classe de produit bénéficiera des fonctionnalités des deux.

Vous organiserez votre code dans trois fichiers :

  • Priceable.php : créez un trait appelé Priceable qui gère les fonctionnalités de tarification. Le trait doit avoir :
    • Une propriété privée $price (float)
    • Une méthode setPrice(float $price) qui stocke le prix
    • Une méthode getPrice() qui retourne le prix
    • Une méthode getFormattedPrice() qui retourne le prix au format "$[price]" avec 2 décimales
  • Stockable.php : créez un trait appelé Stockable qui gère les stocks. Le trait doit avoir :
    • Une propriété privée $stock (integer)
    • Une méthode setStock(int $quantity) qui stocke la quantité en stock
    • Une méthode getStock() qui retourne le stock actuel
    • Une méthode isInStock() qui retourne true si le stock est supérieur à 0, et false dans le cas contraire
  • main.php : incluez les deux fichiers de traits et créez une classe Product qui utilise les traits Priceable et Stockable. Utilisez la promotion du constructeur pour définir une propriété publique $name. Le constructeur doit également accepter un prix et une quantité en stock, en utilisant les méthodes des traits pour les définir.

    Vous recevrez trois entrées : un nom de produit, un prix et une quantité en stock. Créez un produit avec ces valeurs et affichez quatre lignes :

    • Le nom du produit
    • Le prix formaté (à l’aide de getFormattedPrice())
    • La quantité en stock
    • "Available" si le produit est en stock, ou "Out of stock" dans le cas contraire

Cela montre comment plusieurs traits fonctionnent ensemble. Votre classe Product acquiert des fonctionnalités de tarification grâce à un trait et de gestion des stocks grâce à un autre, en gardant chaque responsabilité bien séparée tout en les combinant dans un produit complet.

Essayez vous-même

<?php
require_once 'Priceable.php';
require_once 'Stockable.php';

// TODO: Créez une classe Product qui utilise les traits Priceable et Stockable
// Utilisez la promotion de constructeur pour la propriété publique $name
// Le constructeur doit accepter name, price et stock, et utiliser les méthodes des traits pour définir price et stock

class Product {
    // TODO: Utilisez les traits ici

    // TODO: Implémentez le constructeur avec la promotion de constructeur pour $name
    // et définissez price et stock en utilisant les méthodes des traits
}

// Lire l'entrée
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));

// TODO: Créez une instance de Product avec les valeurs d'entrée

// TODO: Affichez le nom du produit
// TODO: Affichez le prix formaté en utilisant getFormattedPrice()
// TODO: Affichez la quantité en stock
// TODO: Affichez "Available" si en stock, ou "Out of stock" sinon
?>
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

Entraînez-vous par vous-même : Compilateur PHP en ligne