Menu
Coddy logo textTech

Enums (PHP 8.1)

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 59 de 91.

Antes de PHP 8.1, representar un conjunto fijo de valores, como estados o tipos, significaba usar constantes de clase o cadenas mágicas; ambos enfoques eran propensos a errores. Las enumeraciones (enums) proporcionan una forma adecuada de definir un tipo que solo puede contener valores específicos y predefinidos.

Define una enumeración usando la palabra clave enum:

<?php
enum Status {
    case Pending;
    case Active;
    case Completed;
}

$status = Status::Active;
echo $status->name;

Salida:

Active

Los enums también pueden tener valores respaldados: valores de cadena o enteros asociados con cada caso. Esto resulta útil al almacenar enums en bases de datos o API:

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Completed = 'completed';
}

$status = Status::Active;
echo $status->value;

Salida:

active

Los enums respaldados proporcionan un método from() para crear un enum a partir de su valor, y tryFrom(), que devuelve null en lugar de generar un error para valores no válidos:

<?php
$status = Status::from('active');      // Devuelve Status::Active
$invalid = Status::tryFrom('unknown'); // Devuelve null

Las enumeraciones también pueden contener métodos, lo que las hace potentes para encapsular lógica relacionada. Funcionan perfectamente con las sugerencias de tipos, asegurando que tus funciones solo acepten valores válidos, sin tener que comprobar si una cadena coincide con las opciones esperadas.

challenge icon

Desafío

Fácil

Construyamos un sistema de gestión de pedidos que use enumeraciones para representar los estados de los pedidos de forma segura en cuanto a tipos. En lugar de depender de cadenas que podrían contener errores tipográficos o ser inválidas, crearás una enumeración respaldada que asigna cada estado a un valor adecuado para la base de datos.

Organizarás tu código en tres archivos:

  • OrderStatus.php: Crea una enumeración respaldada por cadenas llamada OrderStatus con cuatro casos:
    • Pending respaldado por 'pending'
    • Processing respaldado por 'processing'
    • Shipped respaldado por 'shipped'
    • Delivered respaldado por 'delivered'
    Añade un método label() que devuelva una descripción legible para cada estado:
    • Pending devuelve "Awaiting confirmation"
    • Processing devuelve "Being prepared"
    • Shipped devuelve "On the way"
    • Delivered devuelve "Order complete"
  • Order.php: Crea una clase Order que use la enumeración. Incluye el archivo OrderStatus. La clase debe:
    • Aceptar un ID de pedido (cadena) y un OrderStatus en su constructor mediante la promoción del constructor
    • Tener un método getInfo() que devuelva "Order [id]: [status label]"
    • Tener un método getStatusValue() que devuelva el valor respaldado del estado (útil para almacenarlo en la base de datos)
  • main.php: Incluye el archivo Order. Recibirás dos entradas: un ID de pedido y una cadena de estado (como "shipped"). Usa tryFrom() para convertir de forma segura la entrada de cadena en una enumeración OrderStatus. Si el estado es válido, crea un Order e imprime dos líneas:
    • El resultado de getInfo()
    • El resultado de getStatusValue()
    Si la cadena de estado no es válida, imprime "Invalid status".

Este desafío demuestra cómo las enumeraciones proporcionan seguridad de tipos. Tu clase Order solo puede aceptar estados válidos, y el método tryFrom() te permite gestionar de forma segura la entrada del usuario sin arriesgarte a obtener valores no válidos.

Pruébalo tú mismo

<?php

require_once 'Order.php';

// Leer entrada
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));

// TODO: Usa OrderStatus::tryFrom() para convertir de forma segura la cadena de estado a un enum
// tryFrom() devuelve null si el valor es inválido

// TODO: Si el estado es válido, crea un Order e imprime:
// - El resultado de getInfo()
// - El resultado de getStatusValue()

// TODO: If the status is invalid, print "Invalid status"

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online