W3docs

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

Como $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: Vowel

Usar 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: B

El 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 Found

Diferencias clave:

switchmatch
Comparaciónlaxa (==)estricta (===)
Fall-throughsí (requiere break)ninguno
Retorna un valornosí (es una expresión)
Valor no coincidente sin defaultno hace nadalanza 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 match

En 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 break después de cada caso, a menos que deliberadamente quieras fall-through (y coméntalo cuando lo hagas).
  • Incluye un default para manejar valores inesperados en lugar de no hacer nada silenciosamente.
  • Agrupa casos relacionados apilando etiquetas case vacías en lugar de duplicar código.
  • Prefiere match (PHP 8+) cuando estás devolviendo un valor o necesitas comparación estricta.
  • Usa if...elseif cuando estés probando expresiones diferentes, no un valor contra muchos.

Temas relacionados

Práctica

Práctica
En PHP, ¿qué sentencias se pueden usar dentro de una sentencia switch?
En PHP, ¿qué sentencias se pueden usar dentro de una sentencia switch?
Was this page helpful?