Enums en PHP: del caos al orden
\n\n¿Alguna vez ha escrito código donde el estado de un pedido se almacena como una cadena 'new', 'paid', 'shipped'? ¿Y luego ha tenido errores por un error tipográfico como 'shippped'? ¿O ha pasado a una función getOrderByStatus('Active'), cuando esperaban 'active'? ¿Le suena familiar? Entonces este artículo es para usted.
Durante mucho tiempo, PHP no tuvo enumeraciones nativas (enums). Los desarrolladores se las ingeniaban: usaban constantes de clase, arrays, incluso comentarios ficticios. Pero con la llegada de PHP 8.1 todo cambió. Ahora tenemos enumeraciones PHP completas: una herramienta poderosa que hace que el código sea más limpio, seguro y comprensible.
\n\nEn esta guía, analizaremos los enums PHP de principio a fin: desde la sintaxis básica hasta técnicas avanzadas. Aprenderá a crear enumeraciones, trabajar con ellas, compararlas y usarlas en proyectos reales. ¡Comencemos!
\n\n¿Qué es un Enum en PHP?
\n\nUn Enum (enumeración) es un tipo de datos que se limita a un conjunto de valores predefinidos. En palabras simples: usted define una lista de opciones posibles, y una variable solo puede tomar uno de ellos. Sin cadenas aleatorias, sin valores no verificados.
\n\nEn PHP 8.1, las enumeraciones se implementan como clases especiales. Cada valor es un objeto, no solo una constante. Esto ofrece muchas ventajas:
\n\n- \n
- Tipado estricto: el compilador no permitirá
'pending'en lugar deStatus::Pending\n - Seguridad: sin errores tipográficos accidentales \n
- Legibilidad: el código habla por sí mismo \n
- Soporte IDE: el autocompletado funciona de maravilla \n
Sintaxis de Enum en PHP
\n\nCrear una enumeración en PHP es sencillo. Use la palabra clave enum:
<?php\n\nenum OrderStatus\n{\n case New;\n case Pending;\n case Processing;\n case Shipped;\n case Delivered;\n case Cancelled;\n}\n\n\nAhora podemos usar OrderStatus como tipo:
<?php\n\nfunction updateOrderStatus(OrderStatus $status): void\n{\n // Procesamiento del estado\n}\n\n// Pasamos el valor:\nupdateOrderStatus(OrderStatus::Shipped);\n\n\nIntente pasar la cadena 'shipped' — PHP mostrará un error de tipo. Eso es la magia de los enum en PHP.
Enum con respaldo (Backed Enums)
\n\nA menudo necesitamos asociar cada caso con un valor específico, por ejemplo, un número o una cadena para la base de datos. En PHP esto se llama backed enum:
\n\n<?php\n\nenum OrderStatus: string\n{\n case New = 'new';\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n}\n\n\nAhora cada caso tiene un valor de cadena. Puede obtenerlo a través de la propiedad value:
<?php\n\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n\nY también puede crear un caso a partir del valor inversamente:
\n\n<?php\n\n$status = OrderStatus::from('shipped');\necho $status->name; // 'Shipped'\n\n\nEl método from() lanzará una excepción si no se encuentra el valor. Si desea obtener null, use tryFrom().
Métodos en Enum: comportamiento dentro de las enumeraciones
\n\nUna de las características geniales de los PHP enum es la posibilidad de agregar métodos directamente dentro de la enumeración. Esto convierte al enum de una simple lista de constantes en un objeto completo con lógica.
\n\n<?php\n\nenum OrderStatus: string\n{\n case New = 'new';\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n\n public function label(): string