Menu

switch en PHP: case, break y fallthrough

switch ($value) compara un valor con una lista de etiquetas case y ejecuta el código desde la primera coincidencia hasta un break. Incluye varios case, fallthrough, default, switch(true) y por qué switch usa la comparación flexible ==.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

switch ($value) compara un valor con una lista de etiquetas case y ejecuta el código bajo la primera etiqueta que coincide. Cada case termina con break; default se encarga de todo lo que no coincidió con nada.

Pon $day a 'fri', 'sun' o 'wed' y vuelve a ejecutarlo. El case default no necesita break cuando es el último.

Varios case para un bloque

Para ejecutar el mismo código con varios valores, apila las etiquetas case sin nada entre ellas. Una etiqueta que coincide continúa hasta el código de debajo.

A diferencia de match, un switch no tiene la sintaxis con comas case 'jpg', 'jpeg':. Apilar etiquetas es la única forma.

Fallthrough: qué pasa sin break

break es lo que detiene un switch. Sin él, PHP ejecuta el case que coincide y sigue con todos los case de debajo, ignorando sus etiquetas, hasta encontrar un break o el final.

Aquí el fallthrough es intencionado: cada plan obtiene sus propias funciones más todas las de los planes más baratos. Cuando lo escribas a propósito, añade un comentario como // no break para que quien lea después no lo "arregle". Cuando no era tu intención, un break olvidado es uno de los bugs más comunes de switch.

switch usa comparación flexible (==)

Cada case se comprueba con ==, no con ===. Una cadena numérica coincide con un número, null coincide con false y con "", y true coincide con cualquier valor que cuente como verdadero. Toca las celdas para comparar los dos operadores.

switch compara con ==, match compara con ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

La consecuencia práctica: una cadena "1" que llega de un formulario cae en case 1: sin ninguna conversión, que muchas veces es lo que quieres. Pero switch (true) con una cadena no vacía, o null frente a case false:, pueden elegir un case que no esperabas.

Fíjate en la línea de null: nunca llega a case false:, porque null == 0 ya es verdadero y case 0: va antes. Con la comparación flexible, el orden de los case cambia el resultado. Desde PHP 8, 0 == "a" es falso (en PHP 7 era verdadero), así que una cadena no numérica ya no coincide con case 0:. Si necesitas ===, usa una expresión match, explicada al final de esta página.

switch(true) para rangos y condiciones

Una etiqueta case puede ser cualquier expresión. Con switch (true), cada case es una condición, y gana la primera que sea igual a true.

Asegúrate de que cada case sea un booleano real. Por la comparación flexible, case $name: coincidiría siempre que $name fuera una cadena no vacía.

switch dentro de un bucle: break y continue

Dentro de un bucle, break en un switch solo sale del switch, no del bucle. Para detener el bucle, usa break 2. continue dentro de un switch se comporta como break, y PHP avisa al compilar: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Escribe continue 2 para saltar a la siguiente iteración del bucle.

switch vs match

PHP 8 añadió match, que cubre la mayoría de los usos de switch con menos código. Compara con ===, devuelve un valor, nunca hace fallthrough, permite condiciones separadas por comas y lanza un UnhandledMatchError cuando nada coincide, así que un case olvidado no puede pasar en silencio.

Quédate con switch cuando un case necesita varias sentencias, o cuando el fallthrough es justo lo que buscas, como en el ejemplo de los planes. Para convertir un valor en un resultado, match es más corto y más seguro.

Preguntas frecuentes

¿Cómo uso varios case para un mismo bloque en un switch de PHP?

Apila las etiquetas case sin código entre ellas: case 'sat': case 'sun': echo 'weekend'; break;. Cada etiqueta cae hasta el código compartido. switch no tiene la sintaxis case 'sat', 'sun':; esa forma con comas es de match.

¿El switch de PHP usa comparación estricta?

No. switch compara con el == flexible, así que case '1': coincide con el entero 1 y case 0: coincide con '0'. Para una comparación estricta ===, usa una expresión match o switch (true) con === dentro de cada case.

¿Qué pasa si olvido el break en un switch de PHP?

La ejecución sigue hacia abajo: tras el case que coincide, PHP sigue ejecutando el código de todos los case de debajo hasta llegar a un break, un return o el final del switch. A veces es intencionado, pero casi siempre es un bug.

¿Puede un switch de PHP comprobar rangos como mayor que?

Sí, con switch (true): cada case contiene una condición como case $score >= 90:, y se ejecuta la primera que sea verdadera. Una expresión match (true) hace lo mismo con comparación estricta y devuelve un valor.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR