W3docs

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: Winter

Ejemplos

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 switch es más fácil de leer que muchas instrucciones if cuando 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

Práctica

Práctica
Según el contenido de la página en w3docs.com, ¿en qué circunstancias se puede usar una instrucción 'switch' en PHP?
Según el contenido de la página en w3docs.com, ¿en qué circunstancias se puede usar una instrucción 'switch' en PHP?
Was this page helpful?