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

Active

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

active

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

challenge icon

Défi

Facile

Construisons 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é OrderStatus avec quatre cas :
    • Pending associé à 'pending'
    • Processing associé à 'processing'
    • Shipped associé à 'shipped'
    • Delivered associé à 'delivered'
    Ajoutez une méthode 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 classe Order qui utilise l'enum. Incluez le fichier OrderStatus. La classe doit :
    • Accepter un ID de commande (string) et un OrderStatus dans 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)
  • 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"). Utilisez tryFrom() pour convertir en toute sécurité l'entrée de type chaîne en un enum 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 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"

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