¿Por qué «Enumerations in PHP» es una pregunta millonaria?
\n\nSi alguna vez buscaste en Google «enumerations in PHP», sabes que antes de PHP 8.1 este tema era una verdadera odisea. Los desarrolladores reinventaban la rueda con constantes, clases abstractas y traits ingeniosos. Stack Overflow estaba lleno de preguntas como «¿Cómo emular un Enum en PHP?», y las respuestas acumulaban cientos de votos positivos.
\n\nPero los tiempos han cambiado. Desde PHP 8.1, las enumeraciones (Enum) son una parte nativa del lenguaje. Y no es solo azúcar sintáctica: es una herramienta poderosa para escribir código limpio, seguro y autodocumentado.
\n\nEn este artículo lo cubriremos todo: desde el enfoque clásico con constantes hasta los Enum modernos, con ejemplos reales y mejores prácticas. ¡Allá vamos!
\n\nEl problema: ¿cómo vivían los desarrolladores PHP antes de PHP 8.1?
\n\nAntes de las enumeraciones nativas, teníamos dos caminos principales: constantes de clase y «parches» con clases abstractas. Veamos ambos.
\n\nEnfoque n.º 1: Constantes de clase (el más popular)
\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// Uso\n$status = OrderStatus::PENDING;\nif ($status === OrderStatus::PROCESSING) {\n echo 'El pedido se está procesando';\n}\n\nVentajas: simplicidad, claridad, autocompletado en el IDE.
\nDesventajas: falta de tipado. Cualquiera puede pasar el string 'invalid_status' y PHP no se quejará.
\n\nEnfoque n.º 2: Clase abstracta + constructor privado
\n\nLos desarrolladores avanzados iban más allá:
\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 // ... demás estados\n}\n\nFuncionaba, pero el código se inflaba. Y seguía siendo una emulación, no un soporte real del lenguaje.
\n\nEnum nativos en PHP 8.1: una revolución
\n\nCon la llegada de PHP 8.1, el problema de «enumerations in PHP» se resolvió de una vez por todas. Ahora las enumeraciones son tipos completos que:
\n\n- \n
- Soportan tipado estricto \n
- Tienen métodos integrados (
name,value,cases()) \n - Pueden implementar interfaces \n
- Soportan traits \n
- Se integran con
matchyswitch\n
Sintaxis básica de Enum en PHP
\n\nenum OrderStatus {\n case Pending;\n case Processing;\n case Shipped;\n case Delivered;\n case Cancelled;\n}\n\n// Uso\n$status = OrderStatus::Pending;\necho $status->name; // 'Pending'\n\nSimple y elegante. Pero esto es solo el comienzo.
\n\nTipos de Enum: puros y con valores
\n\nPHP admite dos tipos de enumeraciones:
\n\n1. Pure Enum (enumeraciones puras)
\nSin vinculación a valores concretos. Ideal para banderas, estados, tipos.
\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 (enumeraciones con valores)
\nCuando necesitas asociar un enum con un valor concreto (string o entero).
\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// Obtener el valor\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n// Crear desde un valor\n$