php-control-de-flujo-en-php

Control de flujo en PHP

  • 4 min

Las estructuras de control de flujo permiten decidir qué instrucciones se ejecutan y en qué orden.

Un script que siempre hace lo mismo es aburrido. La potencia de la programación reside en la capacidad de decidir: “Si el usuario es administrador, muéstrale el panel; si no, mándalo al login”.

Para esto usamos las estructuras de control. Vamos a ver las básicas, pero con un enfoque profesional para evitar que tu código se convierta en una pirámide ilegible.

El clásico if / else

La sintaxis la conoces de casi cualquier lenguaje.

$edad = 18;

if ($edad >= 18) {
    echo "Puedes pasar.";
} else {
    echo "Vuelve a casa.";
}
Copied!

La regla de las llaves

PHP permite omitir las llaves si solo hay una instrucción:

// Funciona, pero NO lo hagas
if ($edad >= 18) echo "Pasa"; 
Copied!

Según PSR-12: Usa siempre las llaves {}, aunque solo tengas una línea dentro. ¿Por qué? Porque si mañana necesitas añadir una segunda línea al if y te olvidas de poner las llaves, habrás roto la lógica del programa sin darte cuenta. Sé explícito siempre.

El infierno de los else (y cómo evitarlo)

Uno de los mayores errores de principiante es abusar del else. Mira este código (el “Anti-patrón”):

function procesarPago($usuario, $monto) {
    if ($usuario->estaActivo()) {
        if ($monto > 0) {
            if ($usuario->tieneSaldo($monto)) {
                return "Pago realizado";
            } else {
                return "Saldo insuficiente";
            }
        } else {
            return "Monto inválido";
        }
    } else {
        return "Usuario inactivo";
    }
}
Copied!

Esto es difícil de leer. Tienes que mantener en tu cabeza tres niveles de condiciones para saber qué está pasando.

La solución: cláusulas de guarda (guard clauses)

En lugar de anidar hacia dentro, verificamos los errores primero y salimos rápido. Invertimos la lógica para mantener el código plano.

function procesarPago($usuario, $monto) {
    // 1. Validaciones primero (Guardas)
    if (! $usuario->estaActivo()) {
        return "Usuario inactivo";
    }

    if ($monto <= 0) {
        return "Monto inválido";
    }

    if (! $usuario->tieneSaldo($monto)) {
        return "Saldo insuficiente";
    }

    // 2. El "Happy Path" (Camino feliz) al final, sin indentación
    return "Pago realizado";
}
Copied!

El resultado es idéntico, pero este código se lee como una lista de instrucciones.

El operador ternario (? :)

A veces, un if/else ocupa demasiado espacio para algo muy simple, como asignar un valor a una variable.

// Versión larga
if ($esAdmin) {
    $mensaje = "Bienvenido Jefe";
} else {
    $mensaje = "Hola usuario";
}

// Versión Ternaria (Condición ? Verdadero : Falso)
$mensaje = $esAdmin ? "Bienvenido Jefe" : "Hola usuario";
Copied!

El ternario es fantástico para asignaciones. Úsalo para mantener tus vistas limpias.

Evira anidar operadores ternarios: $a ? $b : $c ? $d : $e (Esto es ilegible y en PHP la asociatividad puede dar sorpresas). Si es complejo, usa un if o un match.

El “elvis operator” (?:) vs fusión de null (??)

Vimos en la lección anterior el operador de fusión de null (??). Existe uno muy parecido llamado Operador Elvis (?:), que es un ternario sin la parte del medio.

¿Cuál es la diferencia?

  • Null Coalescing (??): Solo salta si la variable es NULL.
  • Elvis (?:): Salta si la variable es FALSE (o se evalúa como false, p.ej: 0, string vacío, null).

Mira la diferencia crítica:

$cantidad = 0; // El usuario compró 0 unidades

// Usando Elvis (?:)
// El 0 se considera "falso", así que asigna 10. ¡ERROR DE LÓGICA!
$total = $cantidad ?: 10; // Resultado: 10

// Usando Null Coalescing (??)
// El 0 NO es null, así que respeta el valor.
$total = $cantidad ?? 10; // Resultado: 0
Copied!
  • Usa ?? si quieres verificar si algo existe.
  • Usa ?: si quieres verificar si algo tiene valor real (no es cero ni vacío).