Énumérations en PHP : de switch à Enum (guide complet)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi « Énumérations en PHP » est une question cruciale ?

\n\n

Si vous avez déjà cherché « énumérations en PHP » sur Google, vous savez : avant PHP 8.1, ce sujet était un vrai casse-tête. Les développeurs réinventaient la roue avec des constantes, des classes abstraites et des traits astucieux. Stack Overflow regorgeait de questions comme « Comment émuler une Enum en PHP ? », et les réponses récoltaient des centaines de votes positifs.

\n\n

Mais les temps ont changé. Depuis PHP 8.1, les énumérations (Enum) font partie intégrante du langage. Et ce n'est pas qu'un sucre syntaxique : c'est un outil puissant pour écrire un code propre, sécurisé et auto-documenté.

\n\n

Dans cet article, nous allons tout détailler : de l'approche classique avec des constantes aux Enum modernes, avec des exemples concrets et les meilleures pratiques. C'est parti !

\n\n

Le problème : comment vivaient les développeurs PHP avant PHP 8.1

\n\n

Avant l'arrivée des énumérations natives, nous avions deux solutions principales : les constantes de classe et les « bricolages » avec des classes abstraites. Voyons les deux.

\n\n

Approche n°1 : Constantes de classe (la plus populaire)

\n\n
class OrderStatus {\n    const PENDING = 'pending';\n    const PROCESSING = 'processing';\n    const SHIPPED = 'shipped';\n    const DELIVERED = 'delivered';\n    const CANCELLED = 'cancelled';\n}\n\n// Utilisation\n$status = OrderStatus::PENDING;\nif ($status === OrderStatus::PROCESSING) {\n    echo 'Commande en cours de traitement';\n}
\n\n

Avantages : simplicité, clarté, autocomplétion dans l'IDE.

\n

Inconvénients : absence de typage. N'importe qui peut passer une chaîne 'invalid_status' — et PHP ne réagira pas.

\n\n

Approche n°2 : Classe abstraite + constructeur privé

\n\n

Les développeurs avancés allaient plus loin :

\n\n
abstract class OrderStatus {\n    private function __construct() {}\n    \n    public static function pending(): self {\n        return new class extends OrderStatus {};\n    }\n    public static function processing(): self {\n        return new class extends OrderStatus {};\n    }\n    // ... autres statuts
\n\n

Cela fonctionnait, mais le code devenait lourd. Et ce n'était toujours qu'une émulation, pas un vrai support du langage.

\n\n

Les Enum natifs en PHP 8.1 : une révolution

\n\n

Avec la sortie de PHP 8.1, le problème des « énumérations en PHP » a été résolu une fois pour toutes. Désormais, les énumérations sont des types à part entière qui :

\n\n
    \n
  • Prennent en charge le typage strict
  • \n
  • Disposent de méthodes intégrées (name, value, cases())
  • \n
  • Peuvent implémenter des interfaces
  • \n
  • Prennent en charge les traits
  • \n
  • S'intègrent avec match et switch
  • \n
\n\n

Syntaxe de base d'une Enum en PHP

\n\n
enum OrderStatus {\n    case Pending;\n    case Processing;\n    case Shipped;\n    case Delivered;\n    case Cancelled;\n}\n\n// Utilisation\n$status = OrderStatus::Pending;\necho $status->name; // 'Pending'
\n\n

Simple et élégant. Mais ce n'est que le début.

\n\n

Types d'Enum : pures et avec valeurs

\n\n

PHP prend en charge deux types d'énumérations :

\n\n

1. Pure Enum (énumérations pures)

\n

Sans liaison à des valeurs spécifiques. Idéal pour les drapeaux, les états, les types.

\n\n
enum UserRole {\n    case Admin;\n    case Editor;\n    case Viewer;\n}\n\nfunction checkAccess(UserRole $role): bool {\n    return match($role) {\n        UserRole::Admin => true,\n        UserRole::Editor => true,\n        UserRole::Viewer => false,\n    };\n}
\n\n

2. Backed Enum (énumérations avec valeurs)

\n

Lorsque vous devez associer une enum à une valeur spécifique (chaîne ou entier).

\n\n
enum OrderStatus: string {\n    case Pending = 'pending';\n    case Processing = 'processing';\n    case Shipped = 'shipped';\n    case Delivered = 'delivered';\n    case Cancelled = 'cancelled';\n}\n\n// Obtenir la valeur\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n// Créer à partir d'une valeur\n$

Blogs

Book Recommendations