Pourquoi « Énumérations en PHP » est une question cruciale ?
\n\nSi 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\nMais 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\nDans 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\nLe problème : comment vivaient les développeurs PHP avant PHP 8.1
\n\nAvant 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\nApproche n°1 : Constantes de classe (la plus populaire)
\n\nclass 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\nAvantages : simplicité, clarté, autocomplétion dans l'IDE.
\nInconvénients : absence de typage. N'importe qui peut passer une chaîne 'invalid_status' — et PHP ne réagira pas.
\n\nApproche n°2 : Classe abstraite + constructeur privé
\n\nLes développeurs avancés allaient plus loin :
\n\nabstract 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\nCela fonctionnait, mais le code devenait lourd. Et ce n'était toujours qu'une émulation, pas un vrai support du langage.
\n\nLes Enum natifs en PHP 8.1 : une révolution
\n\nAvec 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
matchetswitch\n
Syntaxe de base d'une Enum en PHP
\n\nenum 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\nSimple et élégant. Mais ce n'est que le début.
\n\nTypes d'Enum : pures et avec valeurs
\n\nPHP prend en charge deux types d'énumérations :
\n\n1. Pure Enum (énumérations pures)
\nSans liaison à des valeurs spécifiques. Idéal pour les drapeaux, les états, les types.
\n\nenum 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\n2. Backed Enum (énumérations avec valeurs)
\nLorsque vous devez associer une enum à une valeur spécifique (chaîne ou entier).
\n\nenum 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$