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:00La 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.
Défi
FacileConstruisons 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éPriceablequi 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
- Une propriété privée
Stockable.php: créez un trait appeléStockablequi 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 retournetruesi le stock est supérieur à 0, etfalsedans le cas contraire
- Une propriété privée
main.php: incluez les deux fichiers de traits et créez une classeProductqui utilise les traitsPriceableetStockable. 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
?>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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne