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
$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
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
$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
$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
$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
// 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
};
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
$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
// ✓ 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 $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";
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales y soporte personalizado.
Descubrir cursos premium