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

// 1. Excepciones Personalizadas de Dominio
class SaldoInsuficienteException extends Exception
{
    public function __construct(
        public readonly float $saldoActual,
        public readonly float $montoSolicitado
    ) {
        $faltante = $montoSolicitado - $saldoActual;
        parent::__construct("Fondos insuficientes: Tienes $" . number_format($saldoActual, 2) . " y solicitaste $" . number_format($montoSolicitado, 2) . ". Te faltan $" . number_format($faltante, 2));
    }
}

class CuentaBloqueadaException extends Exception {}

// 2. Clase de Negocio
class CuentaCajero
{
    public function __construct(
        private string $cliente,
        private float $saldo,
        private bool $bloqueada = false
    ) {}

    public function retirar(float $monto): void
    {
        if ($this->bloqueada) {
            throw new CuentaBloqueadaException("La cuenta de {$this->cliente} está temporalmente bloqueada por seguridad.");
        }

        if ($monto > $this->saldo) {
            throw new SaldoInsuficienteException($this->saldo, $monto);
        }

        $this->saldo -= $monto;
        echo "<p style='color:#10b981;'> Retiro exitoso de $" . number_format($monto, 2) . ". Saldo restante: $" . number_format($this->saldo, 2) . "</p>";
    }
}

// 3. Manejo con Bloque try - catch - finally
echo "<h2>Procesando Operaciones en Cajero Automático:</h2>";

$cuentas = [
    new CuentaCajero("Carlos Mendoza", 500.00, false), // Operación normal
    new CuentaCajero("Valeria Torres", 100.00, false), // Saldo insuficiente
    new CuentaCajero("Marcos Díaz",    1000.00, true), // Cuenta bloqueada
];

foreach ($cuentas as $i => $cuenta) {
    echo "<div style='font-family:system-ui; background:#f8fafc; border:1px solid #cbd5e1; border-radius:8px; padding:12px; margin-bottom:12px;'>";
    echo "<strong>Transacción #" . ($i + 1) . ":</strong>";

    try {
        // Intentar retirar $300
        $cuenta->retirar(300.00);

    } catch (SaldoInsuficienteException $e) {
        echo "<p style='color:#d97706; margin:4px 0;'>⚠️ <strong>Alerta Financiera:</strong> {$e->getMessage()}</p>";

    } catch (CuentaBloqueadaException $e) {
        echo "<p style='color:#dc2626; margin:4px 0;'>⛔ <strong>Seguridad:</strong> {$e->getMessage()}</p>";

    } catch (Throwable $e) {
        echo "<p style='color:#b91c1c;'>❌ Error general imprevisto: {$e->getMessage()}</p>";

    } finally {
        // Se ejecuta SIEMPRE, haya ocurrido error o no
        echo "<small style='color:#64748b;'>[Auditoría] Registro de auditoría guardado en el log del sistema.</small>";
    }

    echo "</div>";
}
Haz clic para editar este código
Vista Previa
Servidor PHP 8.3