Menu
Coddy logo textTech

É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 :

Active

Les é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 :

active

Les é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.

challenge icon

Défi

Facile

Construisons 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ée OrderStatus avec quatre cas :
    • Pending adossé à 'pending'
    • Processing adossé à 'processing'
    • Shipped adossé à 'shipped'
    • Delivered adossé à 'delivered'
    Ajoutez une méthode 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 classe Order qui utilise l’énumération. Incluez le fichier OrderStatus. La classe doit :
    • Accepter un identifiant de commande (chaîne) et un OrderStatus dans 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)
  • main.php : incluez le fichier Order. Vous recevrez deux entrées : un identifiant de commande et une chaîne de statut (comme "shipped"). Utilisez tryFrom() pour convertir en toute sécurité la chaîne saisie en une énumération OrderStatus. Si le statut est valide, créez un Order et affichez deux lignes :
    • Le résultat de getInfo()
    • Le résultat de getStatusValue()
    Si la chaîne de statut est invalide, affichez "Invalid status".

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"

?>
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