switch
En PHP, la instrucción "switch" evalúa un valor y ejecuta diferentes bloques de código según el resultado. Es una alternativa a múltiples "if".
La instrucción switch en PHP
La instrucción switch de PHP evalúa una expresión y ejecuta el bloque de código que coincide con su valor. Es la alternativa más limpia a una larga cadena de instrucciones if / elseif / else cuando se compara la misma variable contra muchos posibles valores.
Este capítulo cubre la sintaxis, la importantísima palabra clave break, el fall-through intencional, la sintaxis alternativa endswitch y el problema de la comparación débil que confunde a la mayoría de los principiantes.
Sintaxis
La sintaxis básica de una instrucción switch en PHP es la siguiente:
<?php
switch ($value) {
case $value1:
// Code block here
break;
case $value2:
// Code block here
break;
default:
// Code block here
}PHP compara $value con cada case de arriba hacia abajo. La primera coincidencia gana: se ejecuta su bloque y break sale del switch. Si ningún case coincide, se ejecuta el bloque opcional default. default no tiene que ir al final, pero colocarlo al final es la convención que los lectores esperan.
Por qué break es importante
La instrucción break detiene la ejecución y sale del bloque switch. Sin ella, PHP sigue ejecutando el código en todos los casos siguientes hasta que encuentra un break o llega al final del bloque — un comportamiento llamado fall-through. Este es el error más común con switch:
<?php
$role = "editor";
switch ($role) {
case "admin":
echo "Full access. ";
// no break — execution "falls through" to the next case
case "editor":
echo "Can edit content. ";
break;
case "viewer":
echo "Read only.";
break;
}
// Output: Can edit content.Aquí editor coincide, imprime su mensaje y el break sale limpiamente. Olvidar ese break después de admin dejaría que un administrador también ejecutara el código de editor. Consulta break para conocer la palabra clave completa.
Fall-through intencional
El fall-through no es siempre un error. Apilar etiquetas case vacías permite que varios valores compartan un mismo bloque — una forma limpia de agrupar condiciones:
<?php
$month = 2;
switch ($month) {
case 12:
case 1:
case 2:
echo "Winter";
break;
case 3:
case 4:
case 5:
echo "Spring";
break;
default:
echo "Another season";
}
// Output: WinterEjemplos
Veamos algunos ejemplos prácticos de cómo se usa switch:
<?php
// Example 1
$dayOfWeek = "Wednesday";
switch ($dayOfWeek) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
echo "It's a weekday.";
break;
case "Saturday":
case "Sunday":
echo "It's a weekend.";
break;
}
// Example 2
$grade = "B";
switch ($grade) {
case "A":
echo "Excellent!";
break;
case "B":
echo "Good job!";
break;
case "C":
echo "Could do better.";
break;
default:
echo "Please enter a valid grade.";
}El ejemplo 1 agrupa nombres de días de la semana con etiquetas case apiladas para determinar si es día laboral o fin de semana. El ejemplo 2 asigna una calificación con letras a un mensaje de retroalimentación, con default capturando cualquier valor que no coincida.
El problema de la comparación débil
Por defecto, switch compara con igualdad débil (==), por lo que los valores se comparan después de la conversión de tipos — no con === estricto. Esto puede producir coincidencias sorprendentes:
<?php
$value = "1";
switch ($value) {
case 1:
echo "Matched the integer 1!";
break;
default:
echo "Matched default.";
}
// Output: Matched the integer 1!El string "1" coincide con el entero case 1 porque == convierte los tipos antes de comparar. Cuando necesitas verificación estricta de tipos, utiliza una cadena de if / elseif con ===, o usa la expresión match (PHP 8+), que compara de forma estricta y devuelve un valor:
<?php
$grade = "B";
$message = match ($grade) {
"A" => "Excellent!",
"B" => "Good job!",
"C" => "Could do better.",
default => "Please enter a valid grade.",
};
echo $message;
// Output: Good job!match no tiene fall-through y no necesita break, lo que elimina toda una clase de errores.
Sintaxis alternativa con endswitch
Al insertar PHP dentro de plantillas HTML, la forma de dos puntos/endswitch puede resultar más natural:
<?php switch ($status): ?>
<?php case "active": ?>
<span>Active</span>
<?php break; ?>
<?php default: ?>
<span>Inactive</span>
<?php endswitch; ?>Ventajas
- Legibilidad — un
switches más fácil de leer que muchas instruccionesifcuando se compara la misma variable contra varios valores. - Evaluación única — la expresión del switch se evalúa una sola vez y luego se compara con cada
case.
Capítulos relacionados
- PHP if...else...elseif — ramificación cuando las condiciones difieren
- PHP break y break vs. continue — control del flujo
- PHP operators — comparación e igualdad
- PHP loops — repetición de bloques de código