php-enums-en-php

Enums en PHP

  • 3 min

Un enum es un tipo formado por un conjunto cerrado de casos válidos.

Imagina que estás programando el estado de un post en un blog. Tienes tres opciones: Borrador, Publicado y Archivado.

La forma antigua (El caos):

class Post {
    public const STATUS_DRAFT = 'draft';
    public const STATUS_PUBLISHED = 'published';
    
    public string $status; // Puede ser cualquier string
}

$post->status = 'pubished'; // ❌ Error tipográfico que PHP se traga sin quejarse
Copied!

La forma moderna (Enums): Un Enum es un tipo de objeto especial que solo permite un conjunto limitado y predefinido de valores. Es una lista cerrada.

Enums básicos (pure enums)

Definimos un Enum usando la palabra clave enum.

enum EstadoPost {
    case BORRADOR;
    case PUBLICADO;
    case ARCHIVADO;
}
Copied!

Ahora podemos usar EstadoPost como un Tipo de Dato en nuestras funciones.

class Post {
    // ¡Seguridad total! Solo aceptamos valores válidos
    public EstadoPost $estado;
}

$post = new Post();
$post->estado = EstadoPost::PUBLICADO; // ✅ Correcto

// $post->estado = 'published'; 
// ❌ ERROR FATAL: Must be of type EstadoPost, string given
Copied!

Se acabó el validar manualmente si el string es correcto. PHP lo hace por ti.

Enums respaldados (backed enums)

A veces necesitas guardar ese Enum en una base de datos. La base de datos no entiende de objetos PHP, entiende de textos ('draft') o números (1).

Para eso usamos los Backed Enums (Enumeraciones Respaldadas). Asignamos un valor escalar (int o string) a cada caso.

// Decimos que este Enum está "respaldado" por strings
enum EstadoPost: string {
    case BORRADOR = 'draft';
    case PUBLICADO = 'published';
    case ARCHIVADO = 'archived';
}
Copied!

Conversión automática

  • De Enum a valor: Usamos la propiedad ->value.
echo EstadoPost::BORRADOR->value; // 'draft'
Copied!
  • De valor a Enum: Usamos el método ::from() o ::tryFrom().
$estado = EstadoPost::from('published'); // Devuelve el objeto EstadoPost::PUBLICADO
Copied!

Usa tryFrom() cuando el valor proceda de una entrada no confiable.

Si no existe, tryFrom() devuelve null; from() lanza un ValueError, útil cuando un valor inválido representa un fallo que no quieres ocultar.

Enums con métodos

Los enums de PHP pueden tener métodos, lo que permite mantener junto al tipo parte de su comportamiento.

Son clases al fin y al cabo. Pueden tener lógica interna. Esto es brutal para encapsular lógica de presentación.

enum EstadoPost: string {
    case BORRADOR = 'draft';
    case PUBLICADO = 'published';
    case ARCHIVADO = 'archived';

    // Método para obtener un color para el frontend
    public function color(): string {
        return match($this) {
            self::BORRADOR => 'gris',
            self::PUBLICADO => 'verde',
            self::ARCHIVADO => 'rojo',
        };
    }
    
    // Método para obtener etiqueta legible
    public function etiqueta(): string {
        return match($this) {
            self::BORRADOR => 'En Edición',
            self::PUBLICADO => 'Visible',
            self::ARCHIVADO => 'Oculto',
        };
    }
}
Copied!

Mira qué limpieza de código en tu vista:

$estado = EstadoPost::PUBLICADO;

echo "<span class='badge-{$estado->color()}'>{$estado->etiqueta()}</span>";
// Salida: <span class='badge-verde'>Visible</span>
Copied!

Ya no necesitas if/else gigantes en tus plantillas HTML. El Enum sabe cómo pintarse a sí mismo.

Listar todos los casos (cases)

Si necesitas llenar un <select> con todas las opciones posibles, los enums proporcionan el método estático ::cases().

foreach (EstadoPost::cases() as $opcion) {
    echo "<option value='{$opcion->value}'>{$opcion->etiqueta()}</option>";
}
Copied!