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