É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 signifiait utiliser des constantes de classe ou des chaînes magiques - deux approches sujettes aux erreurs. Les Enums (é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 en utilisant le 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 adossées — des valeurs de type chaîne ou entier associées à chaque cas. Ceci est utile lors du stockage d'é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, et tryFrom() qui retourne null au lieu de lever une erreur pour les valeurs invalides :
<?php
$status = Status::from('active'); // Retourne Status::Active
$invalid = Status::tryFrom('unknown'); // Retourne null
Les enums peuvent également contenir des méthodes, ce qui les rend puissants pour encapsuler la logique associée. Ils fonctionnent parfaitement avec les indices de type (type hints), garantissant que vos fonctions n'acceptent que des valeurs valides — plus besoin de vérifier si une chaîne de caractères correspond aux options attendues.
Défi
FacileConstruisons un système de gestion de commandes qui utilise des enums pour représenter les statuts de commande de manière sécurisée au niveau des types. Au lieu de s'appuyer sur des chaînes de caractères qui pourraient être mal orthographiées ou invalides, vous allez créer un "backed enum" qui associe chaque statut à une valeur adaptée à une base de données.
Vous organiserez votre code sur trois fichiers :
OrderStatus.php— Créez un enum de type string appeléOrderStatusavec quatre cas :Pendingassocié à'pending'Processingassocié à'processing'Shippedassocié à'shipped'Deliveredassocié à'delivered'
label()qui retourne une description lisible par l'homme pour chaque statut :- Pending retourne
"Awaiting confirmation" - Processing retourne
"Being prepared" - Shipped retourne
"On the way" - Delivered retourne
"Order complete"
Order.php— Créez une classeOrderqui utilise l'enum. Incluez le fichier OrderStatus. La classe doit :- Accepter un ID de commande (string) et un
OrderStatusdans son constructeur en utilisant la promotion de propriété de constructeur - Avoir une méthode
getInfo()qui retourne"Order [id]: [status label]" - Avoir une méthode
getStatusValue()qui retourne la valeur associée (backed value) du statut (utile pour le stockage en base de données)
- Accepter un ID de commande (string) et un
main.php— Incluez le fichier Order. Vous recevrez deux entrées : un ID de commande et une chaîne de caractères de statut (comme"shipped"). UtiliseztryFrom()pour convertir en toute sécurité l'entrée de type chaîne en un enumOrderStatus. 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 démontre comment les enums 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 en toute sécurité les entrées utilisateur sans risquer de valeurs invalides.
Aide-mémoire
Les énumérations (enums) offrent un moyen sécurisé au niveau des types de définir un ensemble fixe de valeurs. Définissez une énumération en utilisant le mot-clé enum :
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name; // Affiche : Active
Les énumérations adossées (backed enums) associent des valeurs de type chaîne de caractères ou entier à chaque cas :
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value; // Affiche : active
Utilisez from() pour créer une énumération à partir de sa valeur, ou tryFrom() qui retourne null pour les valeurs invalides :
<?php
$status = Status::from('active'); // Retourne Status::Active
$invalid = Status::tryFrom('unknown'); // Retourne null
Les énumérations peuvent contenir des méthodes pour encapsuler la logique associée :
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
public function label(): string {
return match($this) {
self::Pending => 'Awaiting',
self::Active => 'In Progress',
};
}
}
Essayez vous-même
<?php
require_once 'Order.php';
// Lire l'entrée
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO : Utiliser OrderStatus::tryFrom() pour convertir en toute sécurité la chaîne de statut en une énumération
// tryFrom() retourne null si la valeur est invalide
// TODO : Si le statut est valide, créer une commande (Order) et afficher :
// - Le résultat de getInfo()
// - Le résultat de getStatusValue()
// TODO : Si le statut est invalide, afficher "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
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