Enumeraciones en PHP: de switch a Enum (guía completa)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué «Enumerations in PHP» es una pregunta millonaria?

\n\n

Si 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\n

Pero 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\n

En 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\n

El problema: ¿cómo vivían los desarrolladores PHP antes de PHP 8.1?

\n\n

Antes de las enumeraciones nativas, teníamos dos caminos principales: constantes de clase y «parches» con clases abstractas. Veamos ambos.

\n\n

Enfoque n.º 1: Constantes de clase (el más popular)

\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// Uso\n$status = OrderStatus::PENDING;\nif ($status === OrderStatus::PROCESSING) {\n    echo 'El pedido se está procesando';\n}
\n\n

Ventajas: simplicidad, claridad, autocompletado en el IDE.

\n

Desventajas: falta de tipado. Cualquiera puede pasar el string 'invalid_status' y PHP no se quejará.

\n\n

Enfoque n.º 2: Clase abstracta + constructor privado

\n\n

Los desarrolladores avanzados iban más allá:

\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    // ... demás estados\n}
\n\n

Funcionaba, pero el código se inflaba. Y seguía siendo una emulación, no un soporte real del lenguaje.

\n\n

Enum nativos en PHP 8.1: una revolución

\n\n

Con 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 match y switch
  • \n
\n\n

Sintaxis básica de 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// Uso\n$status = OrderStatus::Pending;\necho $status->name; // 'Pending'
\n\n

Simple y elegante. Pero esto es solo el comienzo.

\n\n

Tipos de Enum: puros y con valores

\n\n

PHP admite dos tipos de enumeraciones:

\n\n

1. Pure Enum (enumeraciones puras)

\n

Sin vinculación a valores concretos. Ideal para banderas, estados, tipos.

\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 (enumeraciones con valores)

\n

Cuando necesitas asociar un enum con un valor concreto (string o entero).

\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// Obtener el valor\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n// Crear desde un valor\n$                

Blogs

Book Recommendations