Énumérations (PHP 8.1)
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 59 sur 91.
Avant PHP 8.1, représenter un ensemble fixe de valeurs comme des statuts ou des types impliquait d’utiliser des constantes de classe ou des chaînes magiques — deux approches sujettes aux erreurs. Les énumérations fournissent un moyen approprié de définir un type qui ne peut contenir que des valeurs spécifiques et prédéfinies.
Définissez une énumération à l’aide du mot-clé enum :
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Sortie :
ActiveLes énumérations peuvent également avoir des valeurs sous-jacentes — des valeurs de type chaîne ou entier associées à chaque cas. Cela est utile lors du stockage des énumérations dans des bases de données ou des API :
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Sortie :
activeLes énumérations adossées fournissent une méthode from() pour créer une énumération à partir de sa valeur, ainsi que tryFrom(), qui renvoie null au lieu de générer une erreur pour les valeurs invalides :
<?php
$status = Status::from('active'); // Retourne Status::Active
$invalid = Status::tryFrom('unknown'); // Retourne null
Les énumérations peuvent également contenir des méthodes, ce qui les rend puissantes pour encapsuler une logique associée. Elles fonctionnent parfaitement avec les annotations de type, garantissant que vos fonctions n’acceptent que des valeurs valides — plus besoin de vérifier si une chaîne correspond aux options attendues.
Défi
FacileConstruisons un système de gestion des commandes qui utilise des énumérations pour représenter les statuts des commandes de manière sûre du point de vue des types. Au lieu de dépendre de chaînes qui pourraient contenir des fautes de frappe ou être invalides, vous allez créer une énumération adossée à une valeur qui associe chaque statut à une valeur adaptée à une base de données.
Vous organiserez votre code dans trois fichiers :
OrderStatus.php: créez une énumération adossée à des chaînes appeléeOrderStatusavec quatre cas :Pendingadossé à'pending'Processingadossé à'processing'Shippedadossé à'shipped'Deliveredadossé à'delivered'
label()qui renvoie une description lisible pour chaque statut :- Pending renvoie
"Awaiting confirmation" - Processing renvoie
"Being prepared" - Shipped renvoie
"On the way" - Delivered renvoie
"Order complete"
Order.php: créez une classeOrderqui utilise l’énumération. Incluez le fichier OrderStatus. La classe doit :- Accepter un identifiant de commande (chaîne) et un
OrderStatusdans son constructeur en utilisant la promotion de constructeur - Disposer d’une méthode
getInfo()qui renvoie"Order [id]: [status label]" - Disposer d’une méthode
getStatusValue()qui renvoie la valeur adossée du statut (utile pour le stockage dans une base de données)
- Accepter un identifiant de commande (chaîne) et un
main.php: incluez le fichier Order. Vous recevrez deux entrées : un identifiant de commande et une chaîne de statut (comme"shipped"). UtiliseztryFrom()pour convertir en toute sécurité la chaîne saisie en une énumérationOrderStatus. Si le statut est valide, créez unOrderet affichez deux lignes :- Le résultat de
getInfo() - Le résultat de
getStatusValue()
"Invalid status".- Le résultat de
Ce défi montre comment les énumérations assurent la sécurité des types. Votre classe Order ne peut accepter que des statuts valides, et la méthode tryFrom() vous permet de gérer les entrées utilisateur en toute sécurité sans risquer d’utiliser des valeurs invalides.
Essayez vous-même
<?php
require_once 'Order.php';
// Lire l'entrée
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: Utilisez OrderStatus::tryFrom() pour convertir en toute sécurité la chaîne de statut en une enum
// tryFrom() renvoie null si la valeur est invalide
// TODO: Si le statut est valide, créez un Order et affichez :
// - Le résultat de getInfo()
// - Le résultat de getStatusValue()
// TODO: If the status is invalid, print "Invalid status"
?>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