Cuando una variable puede tener varios valores fijos (un día de la semana, una
categoría, un tipo de entrada) y a cada uno le corresponde algo distinto, una cadena
de elseif se vuelve larga y repetitiva. Para eso están switch y match.
Incorrecto: una cadena de elseif que repite la misma variable
Funciona, pero $dia === se repite en cada línea y lo importante (qué número
corresponde a qué nombre) queda escondido.
match
match compara un valor con una lista de opciones y devuelve el resultado de la
que coincide.
Anatomía de un match
$nombre = match ($dia) {
1 => "Lunes", <- si $dia === 1, devuelve "Lunes"
2 => "Martes",
6, 7 => "Fin de semana", <- varias opciones con el mismo resultado
default => "Otro día", <- si ninguna coincide
}; <- termina en punto y coma: es una asignación
Tailwind no trae el CSS de todas sus clases: genera solo el de las clases que
encuentra escritas. Dónde las busca depende de cómo se instaló.
Dónde busca Tailwind las clases
flowchart LR
subgraph CDN["Tailwind por CDN (el curso)"]
A1["PHP genera<br/>el HTML"] --> B1["El navegador recibe<br/>class=bg-red-100"] --> C1["Tailwind lee el HTML final<br/>y genera bg-red-100"]
end
subgraph COMP["Tailwind compilado (proyectos reales)"]
A2["Tailwind lee tus archivos<br/>ANTES de que corra PHP"] --> B2["Solo ve el texto<br/>'bg-' . $color . '-100'"] --> C2["No encuentra bg-red-100:<br/>no genera su CSS"]
end
Con el CDN que usamos (@tailwindcss/browser), Tailwind trabaja en el navegador,
sobre el HTML que PHP ya generó: una clase armada por partes funciona, porque cuando
Tailwind la lee ya está completa. Pero en un proyecto real Tailwind se compila:
revisa tus archivos .php como texto, antes de que PHP se ejecute, y ahí no existe
ninguna clase bg-red-100, solo pedazos.
Incorrecto: armar el nombre de la clase con concatenación
Con el CDN se ve bien, y por eso el error pasa desapercibido. El día que el
proyecto use Tailwind compilado, la insignia sale sin color y sin ningún
mensaje de error. Además, buscar bg-red-100 en el proyecto no encuentra dónde
se usa.
Cada clase aparece escrita entera en el código: funciona con el CDN y
compilado, y se puede encontrar con Ctrl + F. La misma regla vale para
cualquier clase que elijas con PHP, también con if: $clase = "font-bold text-sky-700";,
nunca "text-" . $color . "-700".
switch es la forma antigua, la misma de C. Sigue siendo común en código existente,
así que hay que reconocerla.
<?php$dia = 6;switch ($dia) { case 1: case 3: echo "Hay clase de laboratorio\n"; break; case 6: case 7: echo "Fin de semana\n"; break; default: echo "Día normal\n";}
Fin de semana
Incorrecto: olvidar el break
<?php$tipo = "estudiante";switch ($tipo) { case "estudiante": echo "Descuento del 50%\n"; case "general": echo "Precio normal\n";}
Descuento del 50%Precio normal
Sin break, switchsigue de largo y ejecuta también los casos de abajo.
No da ningún error.
Correcto: un break al final de cada caso
<?php$tipo = "estudiante";switch ($tipo) { case "estudiante": echo "Descuento del 50%\n"; break; case "general": echo "Precio normal\n"; break;}
Descuento del 50%
Cuál usar
Situación
Usa
Un valor fijo → un resultado (nombre, precio, clase)
match
Rangos (>= 6.0, >= 4.0) que devuelven un resultado
match (true) o if / elseif
Cada caso hace varias cosas (varias instrucciones)
if / elseif
Código de otra persona que ya usa switch
Entender switch y su break
Diferencias entre switch y match
switch
match
Compara con
== (flexible)
=== (estricto)
Devuelve un valor
No
Sí
Necesita break
Sí, en cada caso
No
Si nada coincide
No hace nada
UnhandledMatchError, salvo que tenga default
El operador ??
?? devuelve el valor de la izquierda si existe y no es null; si no, el de la
derecha. Sirve para dar un valor por defecto.
En la Parte 6 vas a leer datos de la URL, como
buscar.php?q=php. Si alguien entra a buscar.php sin el ?q=, ese dato no
existe. $_GET["q"] ?? "" es la forma de leerlo sin que aparezca un Warning.
$titulo ??= "Mi sitio" es lo mismo que $titulo = $titulo ?? "Mi sitio": solo
asigna si $titulo no existía o era null. La segunda vez ya tenía valor y no lo
cambió.
Pruébalo
Convierte el número del día de la semana (1 a 7) en su nombre con match
Clasifica una nota en concepto con match (true)
Prueba un match sin default con un valor que no está y lee el error
Imprime una variable que no existe con y sin ??, y compara
Error provocado: quita un break de un switch y mira qué casos se ejecutan
Errores comunes
Síntoma
Causa
Solución
Un switch ejecuta varios casos
Falta el break
Un break; al final de cada case
UnhandledMatchError: Unhandled match case
Ningún caso coincidió y no hay default
Agrega default =>
match no encuentra un valor que sí está
El tipo no calza: "1" frente a 1
Convierte antes con (int), o escribe el caso como texto
syntax error, unexpected token "}" tras un match
Falta el ; después de la } final
match (…) { … };
Una clase de Tailwind armada con PHP no aplica estilo (con Tailwind compilado)
El nombre de la clase se armó por partes y Tailwind no lo encontró
Devuelve la clase completa desde el match
Undefined variable al leer algo que puede no venir
Se usó la variable sin ??
$x ?? "defecto"
Checkpoint
Intenta responder antes de desplegar cada pregunta.
¿Qué pasa en un switch si el caso que coincide no tiene break?
Se ejecuta ese caso y todos los que siguen, hasta encontrar un break o el
final del switch.
Llega $tipo = "2" desde un formulario y tu match tiene el caso 2 =>. ¿Coincide?
No: match compara con ===, y "2" (texto) no es 2 (entero). Se resuelve con
match ((int) $tipo) o escribiendo los casos como texto.
¿Cuándo usarías if en vez de match?
Cuando cada caso tiene que hacer varias cosas (no solo devolver un valor), o
cuando las condiciones mezclan variables distintas.
¿Qué imprime echo $x ?? "hola"; si $x = ""? ¿Y si $x no existe?
Con $x = "" imprime "" (nada): la variable existe y no es null, así que ??
la devuelve aunque esté vacía. Si $x no existe, imprime hola, sin Warning.