Condicionales en PHP: if, else, switch y match
En esta lección
- if: ejecutar algo solo si se cumple una condición
- else: qué hacer si no se cumple
- elseif: varias opciones encadenadas
- Condiciones compuestas
- Condicionales anidados
- Elegir un valor: ternario y ??
- switch: comparar un valor con muchos casos
- match: la alternativa moderna (PHP 8)
- Condicionales dentro del HTML
- Un ejemplo completo
- Errores frecuentes
- Resumen
Un programa que hace siempre lo mismo sirve de poco. Una web tiene que decidir: si el usuario ha iniciado sesión, enseñarle su panel; si el formulario tiene errores, mostrarlos; si es menor de edad, aplicarle otra tarifa. Esas decisiones se toman con condicionales. En esta lección aprenderás a usar if, else y elseif, a escribir condiciones compuestas, a elegir entre muchos casos con switch y con match (la forma moderna de PHP 8) y a usar condicionales dentro de una plantilla HTML.
if: ejecutar algo solo si se cumple una condición
La estructura más básica es if (“si”). Entre paréntesis va una condición, una expresión que da true o false; entre llaves, el código que se ejecuta solo si es verdadera:
$plazasLibres = 3;
if ($plazasLibres > 0) {
echo "Quedan $plazasLibres plazas. ¡Apúntate!\n";
}
echo "Fin del aviso\n";
// Quedan 3 plazas. ¡Apúntate!
// Fin del aviso
Si $plazasLibres valiera 0, la primera línea no se mostraría, pero "Fin del aviso" sí: lo que está fuera de las llaves se ejecuta siempre.
Las condiciones suelen construirse con los operadores de comparación (===, !==, <, >=…) y lógicos (&&, ||, !) que viste en Operadores.
Consejo: PHP permite omitir las llaves si dentro hay una sola instrucción, pero no lo hagas. Si más tarde añades una segunda línea, quedará fuera del
ifsin que te des cuenta. Las llaves siempre.
else: qué hacer si no se cumple
else (“si no”) indica el código alternativo. Siempre se ejecuta uno de los dos bloques, nunca ambos:
$edad = 15;
if ($edad >= 18) {
echo "Puedes escalar sin autorización\n";
} else {
echo "Necesitas la autorización de un adulto\n";
}
// Necesitas la autorización de un adulto
elseif: varias opciones encadenadas
Cuando hay más de dos caminos, encadenas condiciones con elseif. PHP las comprueba de arriba abajo y ejecuta solo el bloque de la primera que sea verdadera; el resto se ignoran.
$nota = 7.8;
if ($nota >= 9) {
$calificacion = "Sobresaliente";
} elseif ($nota >= 7) {
$calificacion = "Notable";
} elseif ($nota >= 6) {
$calificacion = "Bien";
} elseif ($nota >= 5) {
$calificacion = "Suficiente";
} else {
$calificacion = "Insuficiente";
}
echo "Nota $nota: $calificacion\n";
// Nota 7.8: Notable
El orden importa. Un 7.8 también cumple $nota >= 6 y $nota >= 5, pero como $nota >= 7 aparece antes, es la que gana. Si pusieras las condiciones de menor a mayor, todo lo que fuera aprobado saldría como “Suficiente”.
Nota: PHP acepta
elseif(junto) yelse if(separado). Con llaves funcionan igual, pero en la sintaxis alternativa con dos puntos solo valeelseif. Usa siempre la forma junta y no tendrás que recordarlo.
Condiciones compuestas
Puedes combinar varias comprobaciones con && (y), || (o) y ! (no):
$edad = 34;
$esSocio = true;
$dia = "martes";
if ($esSocio && $dia === "martes") {
echo "Martes de socios: entrada gratis\n";
} elseif ($edad < 12 || $edad >= 65) {
echo "Entrada reducida: 6 €\n";
} else {
echo "Entrada general: 11 €\n";
}
// Martes de socios: entrada gratis
Cuando una condición se alarga, guárdala en una variable con un nombre claro. El código se lee como una frase:
$edad = 70;
$tieneCarnetJoven = false;
$tarifaReducida = $edad < 12 || $edad >= 65 || $tieneCarnetJoven;
if ($tarifaReducida) {
echo "Pagas 6 €\n";
}
// Pagas 6 €
Valores verdaderos y falsos
La condición de un if no tiene por qué ser un booleano. PHP convierte cualquier valor: 0, 0.0, "", "0", null y el array vacío [] cuentan como falsos, y todo lo demás como verdadero (tienes la tabla completa en Variables).
$carrito = [];
$cupon = "VERANO";
if ($carrito) {
echo "Tienes productos en el carrito\n";
} else {
echo "Tu carrito está vacío\n";
}
if ($cupon) {
echo "Aplicando el cupón $cupon\n";
}
// Tu carrito está vacío
// Aplicando el cupón VERANO
Es cómodo, pero puede engañarte. Si $stock vale 0, if ($stock) es falso, y eso es correcto. Pero si un usuario escribe "0" como respuesta válida, if ($respuesta) lo tomaría como vacío. Cuando el 0 o el "0" sean valores legítimos, compara de forma explícita: if ($respuesta !== "").
Condicionales anidados
Un if puede ir dentro de otro. Es útil cuando una comprobación solo tiene sentido si otra ya se ha cumplido:
$haIniciadoSesion = true;
$rol = "monitor";
if ($haIniciadoSesion) {
if ($rol === "admin") {
echo "Panel de administración\n";
} else {
echo "Panel de $rol\n";
}
} else {
echo "Inicia sesión para continuar\n";
}
// Panel de monitor
Más de dos o tres niveles de anidación hacen el código difícil de seguir. Muchas veces puedes aplanarlo uniendo condiciones con && o, dentro de una función, saliendo pronto con return en cuanto algo no se cumple.
Elegir un valor: ternario y ??
Cuando el if solo sirve para dar un valor a una variable, a menudo basta una expresión. Los operadores que lo permiten están explicados en Operadores; aquí tienes un recordatorio:
$stock = 0;
$mensaje = $stock > 0 ? "Disponible" : "Agotado";
$datos = [];
$orden = $datos['orden'] ?? 'precio';
echo "$mensaje, ordenado por $orden\n";
// Agotado, ordenado por precio
Usa el ternario para elegir entre dos valores sencillos, y ?? para dar un valor por defecto cuando algo puede no existir. Si hay que ejecutar varias instrucciones, vuelve al if.
switch: comparar un valor con muchos casos
Cuando comparas la misma variable con muchos valores concretos, una cadena de elseif resulta repetitiva. switch lo expresa de otra forma:
$dia = "sábado";
switch ($dia) {
case "lunes":
echo "Cerrado por mantenimiento\n";
break;
case "sábado":
case "domingo":
echo "Horario de fin de semana: 9:00 a 21:00\n";
break;
default:
echo "Horario normal: 10:00 a 23:00\n";
}
// Horario de fin de semana: 9:00 a 21:00
Cómo funciona:
- PHP busca el primer
casecuyo valor coincide y empieza a ejecutar desde ahí. breaksale delswitch. Sin él, la ejecución sigue por los casos de debajo aunque no coincidan.- Varios
caseseguidos sin código comparten el mismo bloque, como"sábado"y"domingo". defaultse ejecuta si ningún caso coincide. Es opcional, pero conviene ponerlo.
El olvido del break es el error más típico de switch:
$nivel = 1;
switch ($nivel) {
case 1:
echo "Curso de iniciación\n";
case 2:
echo "Curso de perfeccionamiento\n";
break;
case 3:
echo "Curso avanzado\n";
}
// Curso de iniciación
// Curso de perfeccionamiento
Con $nivel = 1 se muestran dos cursos, porque falta el break tras el primero.
Cuidado:
switchcompara con==, la igualdad débil. Eso significa queswitch ("1")coincide concase 1:, y queswitch (0)también entra encase "0":. Si los tipos importan, usamatch.
match: la alternativa moderna (PHP 8)
match resuelve los problemas de switch y es más corto. Es una expresión, es decir, devuelve un valor que puedes guardar en una variable:
$talla = "M";
$precio = match ($talla) {
"S", "M" => 18,
"L" => 20,
"XL", "XXL" => 22,
default => 25,
};
echo "Camiseta talla $talla: $precio €\n";
// Camiseta talla M: 18 €
Las diferencias con switch:
switch | match | |
|---|---|---|
| Comparación | Débil (==) | Estricta (===) |
| Devuelve un valor | No | Sí |
Necesita break | Sí | No: cada rama es independiente |
| Varios valores en un caso | Varios case seguidos | Separados por comas |
| Cada rama | Puede tener varias instrucciones | Una sola expresión |
| Ningún caso coincide | No hace nada | Lanza UnhandledMatchError |
La comparación estricta evita sorpresas con los tipos:
$opcion = "2"; // los datos de formularios llegan como texto
echo match ($opcion) {
2 => "Has elegido el número 2",
"2" => "Has elegido el texto \"2\"",
};
echo "\n";
// Has elegido el texto "2"
Y si ningún caso coincide y no hay default, match lanza un error en lugar de seguir en silencio. Parece un inconveniente, pero es una ventaja: te enteras enseguida de que te has dejado un caso.
$estado = "cancelado";
echo match ($estado) {
"pendiente" => "En espera",
"pagado" => "Confirmado",
};
// Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string in ...
Los errores como este se pueden capturar, como verás en Excepciones.
match (true) para rangos
match compara con valores exactos, pero con un truco también sirve para rangos: escribe match (true) y pon condiciones en cada rama. Se elige la primera condición que valga true:
$grado = 6.4; // dificultad de una vía, en una escala simplificada
$nivel = match (true) {
$grado < 5 => "Iniciación",
$grado < 6.5 => "Intermedio",
$grado < 7.5 => "Avanzado",
default => "Experto",
};
echo "Vía de grado $grado: $nivel\n";
// Vía de grado 6.4: Intermedio
Es una alternativa compacta a una cadena de elseif cuando cada rama solo asigna un valor.
¿if, switch o match?
if/elseif: condiciones variadas, comparaciones de rangos, varias instrucciones por rama. Es la opción por defecto.match: convertir un valor en otro (un código en un texto, una talla en un precio). Es la mejor opción en PHP 8 cuando cada rama produce un valor.switch: cuando cada caso ejecuta varias instrucciones y no quieres escribir una cadena deelseif. Lo verás mucho en código anterior a PHP 8.
Condicionales dentro del HTML
En las plantillas, donde PHP y HTML se mezclan, se usa la sintaxis alternativa que viste en Sintaxis y echo: dos puntos en lugar de la llave de apertura y endif; al final.
<?php
$usuario = "Nerea";
$avisos = 2;
?>
<header>
<?php if ($usuario !== null): ?>
<p>Hola, <?= htmlspecialchars($usuario) ?></p>
<?php if ($avisos > 0): ?>
<span class="badge"><?= $avisos ?> avisos</span>
<?php endif; ?>
<?php else: ?>
<a href="/login.php">Iniciar sesión</a>
<?php endif; ?>
</header>
Cada <?php endif; ?> dice claramente qué está cerrando, algo que con llaves sueltas entre etiquetas HTML es fácil de perder. Para un único atributo o texto, el ternario dentro de <?= ?> es más corto:
<?php $activa = true; ?>
<a href="/" class="<?= $activa ? 'menu activo' : 'menu' ?>">Inicio</a>
Un ejemplo completo
Calcular el precio de una reserva en un rocódromo según la modalidad, el número de personas y si es fin de semana:
$modalidad = "bono";
$personas = 3;
$finDeSemana = true;
$precioPersona = match ($modalidad) {
"entrada" => 11,
"bono" => 9,
"curso" => 25,
default => null,
};
if ($precioPersona === null) {
echo "Modalidad no válida\n";
} else {
$total = $precioPersona * $personas;
if ($finDeSemana && $modalidad !== "curso") {
$total += 2 * $personas;
}
if ($personas >= 4) {
$total *= 0.9;
echo "Descuento de grupo aplicado\n";
}
echo "Total: $total €\n";
}
// Total: 33 €
Con 3 personas y bono en fin de semana: 9 * 3 = 27, más 2 * 3 = 6 de suplemento, 33 €. No llega a 4 personas, así que no hay descuento de grupo.
Errores frecuentes
- Usar
=en vez de===:if ($rol = "admin")asigna el valor y la condición siempre es verdadera. Para comparar,===. - Poner las condiciones de un
elseifen mal orden: la primera que se cumple gana. Ordena de la más restrictiva a la más general. - Olvidar el
breaken unswitch: la ejecución continúa por los casos siguientes. - Confiar en la comparación débil de
switch:"1"coincide con1y0con"0". Si importa el tipo, usamatch. - Olvidar el
defaultenmatch: si llega un valor no previsto, PHP lanzaUnhandledMatchError. - Poner un punto y coma tras la condición:
if ($x > 0); { ... }termina elifen el;y el bloque se ejecuta siempre. - Tratar
"0"como vacío sin querer:if ($valor)es falso con"0". Compara con!== ""cuando el cero sea válido.
Resumen
| Estructura | Cuándo usarla |
|---|---|
if (...) { } | Ejecutar algo solo si se cumple una condición |
else { } | Alternativa cuando no se cumple |
elseif (...) { } | Varias condiciones; gana la primera verdadera |
&&, ||, ! | Combinar condiciones |
cond ? a : b | Elegir entre dos valores |
$x ?? defecto | Valor por defecto si no existe o es null |
switch | Muchos casos de una variable, con break; compara con == |
match | Convertir un valor en otro; compara con === y devuelve un valor |
match (true) | Rangos de valores en forma compacta |
if (...): ... endif; | Condicionales dentro de plantillas HTML |
En la siguiente lección aprenderás a repetir instrucciones sin copiarlas: bucles.
Pon a prueba lo que has aprendido
¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.