Sentencia switch de PHP con case y bloque default

La sentencia switch de PHP compara una expresión contra una lista de valores case y ejecuta la primera rama que coincide. Úsala cuando una variable puede tomar una de varias opciones fijas y cada opción activa una lógica distinta. Agrupar varias etiquetas case (cada una, una sentencia case de PHP) en una sola rama evita condiciones repetidas en cadenas largas de if/elseif.

Ejemplo de sentencia switch en PHP para comparar valores

Salida:

La salida aparecerá aquí...

Salida:

Escribir recurso

Cómo funciona este ejemplo

  1. switch ($metodo) evalúa $metodo una sola vez y compara el resultado con cada valor case usando comparación laxa (==).
  2. case "GET" no coincide con "POST", así que la ejecución pasa al siguiente caso.
  3. case "POST" coincide. Como no hay break después de esta etiqueta, la ejecución cae en el bloque de case "PUT": así se agrupan ambos métodos en la misma rama.
  4. break sale del switch después de imprimir. Sin break, la ejecución continuaría hacia default.
  5. default actúa como captura general cuando no coincide ningún case. Es opcional, pero recomendable para código defensivo.

¿PHP switch usa comparación estricta o laxa?

PHP switch usa comparación laxa (==), así que los valores pueden convertirse durante la coincidencia. Un error común es que "0" coincida con case 0, y que false también coincida con case 0. El orden de los casos importa: gana la primera coincidencia laxa. Cuando importa la comparación estricta, usa match (PHP 8+) o if/elseif explícitos con ===.

Errores comunes con switch en PHP

Omitir break (caída accidental a casos siguientes):

Incorrecto:

$rol = "administrador";
switch ($rol) {
    case "administrador":
        $etiqueta = "administrador";
    case "editor":
        $etiqueta = "editor";
        break;
}

Correcto:

$rol = "administrador";
switch ($rol) {
    case "administrador":
        $etiqueta = "administrador";
        break;
    case "editor":
        $etiqueta = "editor";
        break;
}

Sin break, un caso que ya coincidió sigue ejecutando las ramas siguientes. La caída intencional debe agrupar etiquetas sin código entre ellas.

Usar continue dentro de un bucle esperando pasar a la siguiente iteración:

Incorrecto:

$elementos = ["mantener", "omitir", "mantener"];

foreach ($elementos as $elemento) {
    switch ($elemento) {
        case "omitir":
            continue; // sale del switch, no del bucle
    }

    echo $elemento . "\\n";
}

Correcto:

$elementos = ["mantener", "omitir", "mantener"];

foreach ($elementos as $elemento) {
    switch ($elemento) {
        case "omitir":
            continue 2; // avanza el foreach
    }

    echo $elemento . "\\n";
}

Dentro de un switch anidado en un bucle, continue se comporta como break para el switch. Usa continue 2 para apuntar al bucle externo.

switch en PHP vs expresión match

switchmatch (PHP 8+)
Sentencia: no devuelve un valorExpresión: devuelve un valor
Comparación laxa (==)Comparación estricta (===)
Tiene fall-through por defectoNo hay fall-through; cada rama devuelve
Soporta bloques de varias líneas por casoUna expresión por rama

Usa switch cuando las ramas contienen varias sentencias o cuando la caída intencional agrupa casos. Usa match cuando quieras mapear un valor a un resultado con seguridad estricta de tipos.

FAQ

¿Por qué se necesita break en una sentencia switch de PHP?

switch en PHP usa fall-through por defecto: cuando un caso coincide, todas las ramas siguientes se ejecutan hasta encontrar un break o llegar al final del bloque switch. La sentencia break sale del switch de inmediato. Omitirla solo es seguro cuando agrupas casos que comparten la misma lógica de forma intencional.

¿Cuándo conviene usar match en lugar de switch en PHP 8+?

Prefiere match cuando necesitas comparación estricta, quieres asignar el resultado a una variable o tienes una sola expresión por rama. Usa switch cuando las ramas incluyen varias sentencias, efectos secundarios o caída deliberada entre casos.