Lección 11 de 75 12 min de lectura

Switch y Match

Cuando tienes múltiples condiciones que comparan el mismo valor, switch y match son alternativas más limpias que cadenas de if-elseif. PHP 8 introdujo match, una versión moderna y más segura.

La sentencia switch

switch compara un valor contra múltiples casos y ejecuta el bloque correspondiente. Es útil cuando tienes muchas comparaciones contra el mismo valor.

PHP
<?php

$diaSemana = 3;

switch ($diaSemana) {
    case 1:
        echo 'Lunes';
        break;
    case 2:
        echo 'Martes';
        break;
    case 3:
        echo 'Miércoles';
        break;
    case 4:
        echo 'Jueves';
        break;
    case 5:
        echo 'Viernes';
        break;
    case 6:
    case 7:
        echo 'Fin de semana';
        break;
    default:
        echo 'Día no válido';
}

// Salida: Miércoles
No olvides el break

Sin break, la ejecución "cae" al siguiente caso (fall-through). Esto puede ser útil intencionalmente (como en case 6 y 7 arriba), pero generalmente es fuente de bugs.

Switch con strings

Switch funciona con cualquier tipo de dato, no solo números:

PHP
<?php

$metodoHttp = 'POST';

switch ($metodoHttp) {
    case 'GET':
        $mensaje = 'Obteniendo datos...';
        break;
    case 'POST':
        $mensaje = 'Creando recurso...';
        break;
    case 'PUT':
    case 'PATCH':
        $mensaje = 'Actualizando recurso...';
        break;
    case 'DELETE':
        $mensaje = 'Eliminando recurso...';
        break;
    default:
        $mensaje = 'Método no soportado';
}

echo $mensaje; // Creando recurso...

El problema de switch: comparación débil

switch usa comparación débil (==), lo que puede causar comportamientos inesperados:

PHP
<?php

$valor = 0;

switch ($valor) {
    case 'texto':
        echo 'Es texto';
        break;
    case 0:
        echo 'Es cero';
        break;
}

// ¡Sorpresa! Imprime "Es texto" porque 'texto' == 0 es true
// (el string se convierte a 0 en la comparación)

La expresión match (PHP 8+)

PHP 8 introdujo match, una alternativa moderna a switch que soluciona sus problemas principales:

PHP
<?php

$diaSemana = 3;

$nombreDia = match ($diaSemana) {
    1 => 'Lunes',
    2 => 'Martes',
    3 => 'Miércoles',
    4 => 'Jueves',
    5 => 'Viernes',
    6, 7 => 'Fin de semana',
    default => 'Día no válido',
};

echo $nombreDia; // Miércoles

Ventajas de match sobre switch

PHP
<?php

// 1. Match es una EXPRESIÓN (devuelve un valor)
$resultado = match ($codigo) {
    200 => 'OK',
    404 => 'No encontrado',
    500 => 'Error del servidor',
    default => 'Desconocido',
};

// 2. Usa comparación ESTRICTA (===)
$valor = 0;
$tipo = match ($valor) {
    'texto' => 'Es texto',    // No coincide porque 'texto' !== 0
    0 => 'Es cero',           // ¡Esto sí coincide!
    default => 'Otro',
};
echo $tipo; // "Es cero" (comportamiento correcto)

// 3. No necesita break (no hay fall-through)
$color = match ($semaforo) {
    'rojo' => 'Detenerse',
    'amarillo' => 'Precaución',
    'verde' => 'Avanzar',
    default => 'Desconocido',
};

// 4. Múltiples valores en una línea
$esFinDeSemana = match ($dia) {
    'sábado', 'domingo' => true,
    default => false,
};

// 5. Lanza excepción si no hay coincidencia (sin default)
$nombre = match ($id) {
    1 => 'Ana',
    2 => 'Luis',
    // Sin default: lanza UnhandledMatchError si $id no es 1 o 2
};
match es una expresión

A diferencia de switch (que es una sentencia), match devuelve un valor. Esto permite usarlo directamente en asignaciones, argumentos de funciones, o cualquier lugar donde se espere un valor.

Match con expresiones complejas

Los brazos de match pueden contener expresiones, no solo valores simples:

PHP
<?php

$edad = 25;

// Match con condiciones booleanas usando true
$categoria = match (true) {
    $edad < 13 => 'Niño',
    $edad < 18 => 'Adolescente',
    $edad < 65 => 'Adulto',
    default => 'Senior',
};

echo $categoria; // Adulto

// Llamando funciones en los brazos
$extension = 'jpg';

$tipo = match ($extension) {
    'jpg', 'jpeg', 'png', 'gif' => 'imagen',
    'pdf' => 'documento',
    'mp4', 'avi', 'mov' => 'video',
    default => 'desconocido',
};

// Los valores pueden ser expresiones o llamadas a funciones
$resultado = match ($operacion) {
    'suma' => $a + $b,
    'resta' => $a - $b,
    'multiplica' => $a * $b,
    'divide' => $b !== 0 ? $a / $b : throw new DivisionByZeroError(),
    default => throw new InvalidArgumentException('Operación no válida'),
};

Cuándo usar cada uno

PHP
<?php

// ✓ USA MATCH cuando:
// - Necesitas devolver un valor basado en una condición
// - Quieres comparación estricta
// - Cada caso tiene una sola expresión

$icono = match ($tipo) {
    'error' => '❌',
    'warning' => '⚠️',
    'success' => '✅',
    default => 'ℹ️',
};

// ✓ USA SWITCH cuando:
// - Necesitas ejecutar múltiples sentencias por caso
// - Necesitas fall-through intencional
// - Trabajas con PHP < 8

switch ($comando) {
    case 'iniciar':
        conectarBaseDatos();
        cargarConfiguracion();
        iniciarServidor();
        break;
    case 'parar':
        cerrarConexiones();
        guardarEstado();
        break;
}

// ✓ USA IF-ELSEIF cuando:
// - Las condiciones son complejas y diferentes entre sí
// - No estás comparando el mismo valor

if ($usuario->esAdmin() && $recurso->esPrivado()) {
    // ...
} elseif ($usuario->tienePermiso($recurso)) {
    // ...
} else {
    // ...
}

Sintaxis alternativa de switch

Como if, switch tiene una sintaxis alternativa para templates:

PHP
<?php $rol = 'editor'; ?>

<div class="menu">
    <?php switch ($rol): ?>
        <?php case 'admin': ?>
            <a href="/admin">Panel Admin</a>
            <a href="/usuarios">Usuarios</a>
            <?php break; ?>
        <?php case 'editor': ?>
            <a href="/articulos">Artículos</a>
            <?php break; ?>
        <?php default: ?>
            <a href="/perfil">Mi Perfil</a>
    <?php endswitch; ?>
</div>

Ejercicios

Ejercicio 1: Dia de la semana con switch

Dado $numeroDia = 4, usa switch para asignar el nombre del dia (1=Lunes, 2=Martes, etc.). Imprime el resultado.

Ver solucion
<?php

declare(strict_types=1);

$numeroDia = 4;

switch ($numeroDia) {
    case 1:
        $nombreDia = 'Lunes';
        break;
    case 2:
        $nombreDia = 'Martes';
        break;
    case 3:
        $nombreDia = 'Miercoles';
        break;
    case 4:
        $nombreDia = 'Jueves';
        break;
    case 5:
        $nombreDia = 'Viernes';
        break;
    case 6:
    case 7:
        $nombreDia = 'Fin de semana';
        break;
    default:
        $nombreDia = 'Dia no valido';
}

echo "Dia $numeroDia: $nombreDia\n";

Ejercicio 2: Tipo de archivo con match

Dada la extension $extension = "png", usa match para determinar el tipo: jpg/jpeg/png/gif = "imagen", pdf/doc = "documento", mp4/avi = "video", default = "desconocido".

Ver solucion
<?php

declare(strict_types=1);

$extension = 'png';

$tipo = match ($extension) {
    'jpg', 'jpeg', 'png', 'gif' => 'imagen',
    'pdf', 'doc' => 'documento',
    'mp4', 'avi' => 'video',
    default => 'desconocido',
};

echo "Archivo .$extension es de tipo: $tipo\n";

Ejercicio 3: Calificacion con match y condiciones

Dada $nota = 72, usa match con true para asignar: menos de 50 = "Suspenso", 50-69 = "Aprobado", 70-89 = "Notable", 90+ = "Sobresaliente".

Ver solucion
<?php

declare(strict_types=1);

$nota = 72;

$calificacion = match (true) {
    $nota >= 90 => 'Sobresaliente',
    $nota >= 70 => 'Notable',
    $nota >= 50 => 'Aprobado',
    default => 'Suspenso',
};

echo "Nota: $nota - Calificacion: $calificacion\n";

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium