libro / blog / estructuras-control-php-match

// estructuras de control

Estructuras de control en PHP: if, match, switch y bucles con ejemplos

Gustavo Arias8 min de lectura

TL;DR Para elegir entre varios valores, prefiere match a switch: compara de forma estricta, devuelve un valor y falla si no hay coincidencia. Recorre arrays con foreach, sal pronto de las funciones con returns tempranos en lugar de anidar if, y cuidado con las referencias dentro de los bucles.

Las estructuras de control deciden qué código se ejecuta y cuántas veces. Son pocas y parecen simples, pero usarlas bien marca la diferencia entre un código que se lee de un vistazo y uno lleno de if anidados. En el libro PHP desde cero hasta experto tienen su propio capítulo; aquí repasamos lo esencial con las novedades de PHP 8.

Condicionales: if, elseif, else

<?php
$stock = 3;

if ($stock === 0) {
    $estado = 'Agotado';
} elseif ($stock < 5) {
    $estado = 'Últimas unidades';
} else {
    $estado = 'Disponible';
}

// Ternario: para elegir entre dos valores en una línea
$etiqueta = $stock > 0 ? 'En stock' : 'Sin stock';

El ternario es útil para casos simples. Si necesitas anidar uno dentro de otro, vuelve al if o usa match: PHP 8 incluso prohíbe anidar ternarios sin paréntesis porque el resultado era confuso.

match: el switch moderno de PHP 8

match es una expresión: devuelve un valor. Compara con ===, no necesita break y lanza un error si ningún caso coincide, en lugar de seguir en silencio.

<?php
$estadoPedido = 'enviado';

// Con switch: verboso y fácil de romper si olvidas un break
switch ($estadoPedido) {
    case 'pendiente':
        $texto = 'Estamos preparando tu pedido';
        break;
    case 'enviado':
        $texto = 'Tu pedido está en camino';
        break;
    default:
        $texto = 'Estado desconocido';
}

// Con match: una expresión, comparación estricta y varios valores por caso
$texto = match ($estadoPedido) {
    'pendiente', 'pagado' => 'Estamos preparando tu pedido',
    'enviado'             => 'Tu pedido está en camino',
    'entregado'           => '¡Entregado!',
    default               => 'Estado desconocido',
};

match con condiciones

Con match (true) cada rama puede ser una condición, una alternativa muy legible a una cadena de elseif:

<?php
$nota = 7.5;

$calificacion = match (true) {
    $nota >= 9 => 'Sobresaliente',
    $nota >= 7 => 'Notable',
    $nota >= 5 => 'Aprobado',
    default    => 'Desaprobado',
};
echo $calificacion; // Notable
Si quitas el default y ningún caso coincide, match lanza un UnhandledMatchError. Es una ventaja: un valor inesperado se detecta de inmediato en lugar de producir un resultado incorrecto.

Bucles: foreach, for y while

<?php
$productos = [
    ['nombre' => 'Teclado', 'precio' => 45000],
    ['nombre' => 'Mouse',   'precio' => 18000],
];

// foreach: el bucle por defecto para arrays
foreach ($productos as $i => $p) {
    echo ($i + 1) . ". {$p['nombre']}: \${$p['precio']}\n";
}

// for: cuando necesitas un contador
for ($i = 10; $i > 0; $i--) {
    echo $i, ' ';
}

// while: mientras se cumpla una condición (p. ej., leer filas de una consulta)
$intentos = 0;
while ($intentos < 3) {
    $intentos++;
}

// continue salta a la siguiente vuelta; break sale del bucle
foreach ($productos as $p) {
    if ($p['precio'] > 40000) {
        continue;
    }
    echo $p['nombre'];
}

Menos anidación con returns tempranos

Un patrón que mejora muchísimo la legibilidad: comprobar primero los casos de error y salir, para que el camino principal quede sin anidar.

<?php
// Antes: la lógica importante queda enterrada
function procesarPedido(?array $pedido): string
{
    if ($pedido !== null) {
        if ($pedido['items']) {
            if ($pedido['pagado']) {
                return 'Pedido enviado';
            } else {
                return 'Falta el pago';
            }
        } else {
            return 'Pedido vacío';
        }
    } else {
        return 'Pedido inexistente';
    }
}

// Después: primero los errores, luego el caso normal
function procesarPedidoClaro(?array $pedido): string
{
    if ($pedido === null)  return 'Pedido inexistente';
    if (!$pedido['items']) return 'Pedido vacío';
    if (!$pedido['pagado']) return 'Falta el pago';

    return 'Pedido enviado';
}

Errores comunes

Con condicionales y bucles dominados, el siguiente paso natural es agruparlos en funciones reutilizables.

Aprende a pensar como programador

Las estructuras de control tienen su propio capítulo en el libro PHP desde cero hasta experto, con ejercicios que preparan el terreno para formularios y bases de datos.

Comprar en Amazon