Curso de PHP

Estructuras de control switch en PHP y la expresión match

Por Víctor Peña · Publicado el

Estructuras de control switch en PHP

Hola, ¿cómo están? Continuando con el curso de PHP, hoy veremos la estructura switch, que es la alternativa a las cadenas largas de elseif que vimos en la lección de condicionales.

¡Empecemos!

Qué es switch

switch compara una misma variable contra varios valores posibles y ejecuta el bloque que coincida. Cuando tienes cinco o seis elseif comparando siempre lo mismo, switch se lee mucho mejor.

<?php
$dia = 3;

switch ($dia) {
    case 1:
        echo "Lunes";
        break;
    case 2:
        echo "Martes";
        break;
    case 3:
        echo "Miércoles";
        break;
    default:
        echo "Día no válido";
}

Cada case es un valor posible. Cuando uno coincide, se ejecuta su bloque.

El break es obligatorio

Aquí está la particularidad de switch, y el error que comete todo el mundo la primera vez.

Si olvidas el break, la ejecución continúa hacia los casos siguientes, aunque no coincidan:

<?php
$dia = 1;

switch ($dia) {
    case 1:
        echo "Lunes";
        // sin break
    case 2:
        echo "Martes";
        break;
}

Salida: LunesMartes

Se llama fall-through y no es un fallo del lenguaje, es su comportamiento por diseño. Pero rara vez es lo que quieres, así que pon siempre el break.

Cuando el fall-through sí sirve

Hay un caso donde ese comportamiento es útil: agrupar varios valores que hacen lo mismo.

<?php
$dia = "sábado";

switch ($dia) {
    case "lunes":
    case "martes":
    case "miércoles":
    case "jueves":
    case "viernes":
        echo "Día laboral";
        break;
    case "sábado":
    case "domingo":
        echo "Fin de semana";
        break;
}

Al no poner break entre los casos agrupados, todos caen en el mismo bloque. Es la forma idiomática de escribirlo.

El caso default

default se ejecuta cuando ningún caso coincide. Equivale al else de un condicional:

<?php
$rol = "invitado";

switch ($rol) {
    case "admin":
        echo "Acceso total";
        break;
    case "editor":
        echo "Puede editar contenido";
        break;
    default:
        echo "Solo lectura";
}

No es obligatorio, pero conviene ponerlo siempre. Si no lo hay y ningún caso coincide, el switch simplemente no hace nada, y ese silencio esconde errores.

Cuidado: switch compara con ==

Este detalle es importante después de lo que vimos sobre operadores de comparación:

<?php
$valor = "1";

switch ($valor) {
    case 1:
        echo "Entra aquí";   // y entra, porque "1" == 1
        break;
}

switch usa comparación laxa, no estricta. Si trabajas con datos que llegan de un formulario —donde todo es texto— eso puede darte coincidencias que no esperabas. Conviértelos antes, o usa match.

La expresión match

PHP 8 introdujo match, que resuelve casi todos los problemas de switch. Vale mucho la pena conocerla:

<?php
$dia = 3;

$nombre = match ($dia) {
    1 => "Lunes",
    2 => "Martes",
    3 => "Miércoles",
    default => "Día no válido",
};

echo $nombre;

Las diferencias frente a switch:

switch match
Comparación Laxa (==) Estricta (===)
Necesita break No
Devuelve un valor No
Si nada coincide y no hay default No hace nada Lanza un error

Esas cuatro diferencias son todas mejoras. Que devuelva un valor permite asignarlo directamente, y que falle si no encuentra coincidencia convierte un error silencioso en uno visible.

Agrupar valores en match

<?php
$dia = "sábado";

$tipo = match ($dia) {
    "lunes", "martes", "miércoles", "jueves", "viernes" => "Día laboral",
    "sábado", "domingo" => "Fin de semana",
};

Se separan por comas, mucho más compacto que apilar case.

Condiciones en match

match(true) permite evaluar condiciones, no solo valores:

<?php
$nota = 78;

$resultado = match (true) {
    $nota >= 90 => "Excelente",
    $nota >= 70 => "Bueno",
    $nota >= 51 => "Aprobado",
    default => "Reprobado",
};

Es el equivalente a una cadena de elseif, pero mucho más legible.

Cuándo usar cada uno

  • match por defecto, siempre que estés eligiendo un valor. Es más seguro y más corto.
  • switch cuando cada caso ejecuta varias instrucciones, no solo devuelve algo. match solo admite una expresión por rama.

Un ejemplo práctico

Estado de un pedido:

<?php
$estado = "enviado";

$mensaje = match ($estado) {
    "pendiente" => "Tu pedido está en revisión",
    "pagado"    => "Pago confirmado, preparando el envío",
    "enviado"   => "Tu pedido va en camino",
    "entregado" => "Pedido entregado. ¡Gracias!",
    default     => "Estado desconocido",
};

echo $mensaje;

Escrito con elseif serían quince líneas; con switch, veinte. Aquí son seis y se lee de un vistazo.

Sintaxis alternativa con HTML

switch también tiene su versión para plantillas:

<?php switch ($rol): ?>
<?php case "admin": ?>
    <p>Panel de administración</p>
    <?php break; ?>
<?php default: ?>
    <p>Panel de usuario</p>
<?php endswitch; ?>

Se usa poco, porque en plantillas suele bastar con if.

Para cerrar

switch sigue siendo útil cuando cada caso hace varias cosas, pero en PHP moderno match es la opción por defecto: compara de forma estricta, devuelve un valor y no te deja olvidarte de un caso sin avisar.

En la siguiente lección empezamos con las funciones, que es donde el código deja de repetirse.

Saludos y éxitos.

Norvic Software

Desarrollamos el software que tu empresa necesita

Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.

Solicitar cotizaciónVer todos los servicios

Cotización sin costo · Respuesta directa por WhatsApp