Sentencia Switch en PHP: Guía Completa
La sentencia switch de PHP permite controlar el flujo del código comparando una expresión contra múltiples valores posibles de forma clara y eficiente.
La sentencia switch de PHP compara una expresión contra una lista de valores posibles y ejecuta el bloque que coincide. Es la alternativa más limpia a una larga cadena de sentencias if...elseif...else cuando se prueba la misma variable contra muchos valores fijos.
Esta página cubre la sintaxis, cómo funcionan realmente la coincidencia y el fall-through, ejemplos ejecutables reales, la alternativa match de PHP 8 y los errores comunes que suelen cometerse.
Sintaxis
switch (expression) {
case value1:
// runs when expression == value1
break;
case value2:
// runs when expression == value2
break;
default:
// runs when nothing above matched
}La expression se evalúa una sola vez. Su resultado se compara, de arriba hacia abajo, con cada valor case usando comparación laxa (==). En la primera coincidencia, PHP comienza a ejecutar las sentencias desde ese case y continúa hasta que encuentra un break (o el final del switch). El bloque default opcional se ejecuta cuando ningún case coincide — por convención va al final.
Un ejemplo funcional
Este ejemplo asigna un nombre a un número de día e imprime el resultado:
<?php
$day = 3;
switch ($day) {
case 1:
echo "Monday";
break;
case 2:
echo "Tuesday";
break;
case 3:
echo "Wednesday";
break;
default:
echo "Another day";
}
// Output: WednesdayComo $day es 3, el tercer case coincide, se imprime "Wednesday" y break detiene la ejecución antes del bloque default.
Por qué break importa: el fall-through
Si se olvida un break, la ejecución "cae" en el siguiente case y sigue ejecutándose hasta encontrar uno. Este es el error más común en switch:
<?php
$role = "editor";
switch ($role) {
case "editor":
echo "Can edit. ";
// no break — falls through!
case "viewer":
echo "Can view.";
break;
}
// Output: Can edit. Can view.Aquí "editor" coincidió, pero sin break PHP también ejecutó el bloque viewer.
Fall-through intencional (agrupación de casos)
El fall-through puede ser útil de forma intencional: apilar casos vacíos permite que varios valores compartan un mismo bloque.
<?php
$letter = "e";
switch ($letter) {
case "a":
case "e":
case "i":
case "o":
case "u":
echo "Vowel";
break;
default:
echo "Consonant";
}
// Output: VowelUsar switch con una condición mediante true
Un switch también puede reemplazar una escalera if...elseif para verificaciones de rangos. Se utiliza true como expresión y se coloca una expresión booleana en cada case:
<?php
$score = 82;
switch (true) {
case $score >= 90:
echo "A";
break;
case $score >= 80:
echo "B";
break;
case $score >= 70:
echo "C";
break;
default:
echo "F";
}
// Output: BEl primer case cuya expresión sea igual a true gana, por lo que el orden importa — lista primero la condición más restrictiva.
switch vs match (PHP 8+)
PHP 8 agregó la expresión match, un hermano más estricto de switch. Usa match cuando simplemente necesitas mapear un valor a un resultado:
<?php
$status = 404;
$message = match ($status) {
200, 201 => "Success",
404 => "Not Found",
500 => "Server Error",
default => "Unknown",
};
echo $message;
// Output: Not FoundDiferencias clave:
switch | match | |
|---|---|---|
| Comparación | laxa (==) | estricta (===) |
| Fall-through | sí (requiere break) | ninguno |
| Retorna un valor | no | sí (es una expresión) |
Valor no coincidente sin default | no hace nada | lanza UnhandledMatchError |
El problema con la comparación laxa
Debido a que switch usa ==, un 0 numérico puede coincidir con una cadena no vacía en código antiguo. En PHP 8+ las reglas de comparación cadena-a-número se volvieron más estrictas, pero mantén tipos consistentes para evitar sorpresas:
<?php
$value = 0;
switch ($value) {
case "hello":
echo "matched hello";
break;
default:
echo "no match";
}
// Output (PHP 8+): no matchEn PHP 7, el mismo código habría impreso matched hello porque 0 == "hello" era true. En caso de duda, usa match para comparación estricta.
Buenas prácticas
- Siempre añade
breakdespués de cada caso, a menos que deliberadamente quieras fall-through (y coméntalo cuando lo hagas). - Incluye un
defaultpara manejar valores inesperados en lugar de no hacer nada silenciosamente. - Agrupa casos relacionados apilando etiquetas
casevacías en lugar de duplicar código. - Prefiere
match(PHP 8+) cuando estás devolviendo un valor o necesitas comparación estricta. - Usa
if...elseifcuando estés probando expresiones diferentes, no un valor contra muchos.
Temas relacionados
- PHP If...Else...Elseif — ramificación condicional
- PHP Operadores — comparación y la expresión
match - PHP Bucles — repetición de bloques de código