Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
ejemplo.php
Tab = 4 espacios
1
<?php
declare(strict_types=1);

// 1. Definición del Enum Respaldado (Backed Enum)
enum EstadoPedido: string
{
    case Pendiente = 'pending';
    case Procesando = 'processing';
    case Pagado    = 'paid';
    case Cancelado = 'cancelled';

    // Método dentro del enum: Devuelve el texto legible en español
    public function getEtiqueta(): string
    {
        return match($this) {
            self::Pendiente  => '⏳ Pago Pendiente',
            self::Procesando => '🔄 En Preparación',
            self::Pagado     => ' Aprobado & Pagado',
            self::Cancelado  => '❌ Pedido Cancelado',
        };
    }

    // Método que devuelve el color del badge para la interfaz
    public function getColorBadge(): string
    {
        return match($this) {
            self::Pendiente  => '#f59e0b', // Naranja
            self::Procesando => '#0284c7', // Azul
            self::Pagado     => '#10b981', // Verde
            self::Cancelado  => '#ef4444', // Rojo
        };
    }
}

// 2. Clase de Dominio que utiliza el Enum fuertemente tipado
final class Pedido
{
    public function __construct(
        public readonly int $id,
        public readonly string $cliente,
        public readonly float $total,
        private EstadoPedido $estado = EstadoPedido::Pendiente
    ) {}

    public function cambiarEstado(EstadoPedido $nuevoEstado): void
    {
        $this->estado = $nuevoEstado;
    }

    public function renderTarjeta(): void
    {
        $color = $this->estado->getColorBadge();
        $texto = $this->estado->getEtiqueta();
        $valorBD = $this->estado->value;

        echo "<div style='font-family:system-ui; border:1px solid #cbd5e1; border-radius:8px; padding:15px; margin-bottom:12px; background:#fff;'>";
        echo "<div style='display:flex; justify-content:space-between; align-items:center;'>";
        echo "<h4 style='margin:0;'>Pedido #{$this->id} - {$this->cliente}</h4>";
        echo "<span style='background:{$color}; color:white; padding:4px 10px; border-radius:6px; font-size:12px; font-weight:bold;'>{$texto}</span>";
        echo "</div>";
        echo "<p style='margin:8px 0 0 0; color:#475569;'>Total: <strong>$" . number_format($this->total, 2) . "</strong> | Valor en Base de Datos: <code>{$valorBD}</code></p>";
        echo "</div>";
    }
}

// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
$pedido1 = new Pedido(501, "Alejandra Ruiz", 185.00, EstadoPedido::Pagado);
$pedido2 = new Pedido(502, "Marcos Duarte", 420.50, EstadoPedido::Pendiente);
$pedido3 = new Pedido(503, "Camila Soto", 99.00, EstadoPedido::Cancelado);

echo "<h2>Lista de Pedidos con Tipado Estricto de Enums:</h2>";
$pedido1->renderTarjeta();
$pedido2->renderTarjeta();
$pedido3->renderTarjeta();

// Demostración de conversión desde la base de datos:
$estadoDesdeBD = EstadoPedido::from('processing'); // Devuelve EstadoPedido::Procesando
$pedido2->cambiarEstado($estadoDesdeBD);

echo "<h3>Estado de Pedido #502 Actualizado Dinámicamente:</h3>";
$pedido2->renderTarjeta();
Haz clic para editar este código
Vista Previa
Servidor PHP 8.3