1.2Condicionales: if/else, switch, ternario
Lo esencial en 30 segundos
- if/elseif/else = el caso general: condiciones variadas, rangos, lógica (&& || !) — la estructura más flexible.
- switch/match = derivar SOBRE UNA variable: varios valores exactos, más legible que una cascada — break obligatorio en switch.
- Ternario y ?? = cortos y precisos: ternario para asignar en una línea, ?? para los valores por defecto (solo null/ausencia).
Minicaso hilado — Riad muestra la tarifa correcta en Constantine
Riad debe mostrar una tarifa según el perfil del visitante de su sitio vitrina: estudiante, profesional u otro — con una página por defecto si el parámetro falta. Primero escribe if ($profil) con una cascada inestable: el perfil « 0 » (un código legítimo) se trata como ausente por los valores falsy. Lo corrige probando explícitamente, usa un switch con break para los tres perfiles, un ternario para la etiqueta « mayor/menor » de una mención legal, y ?? para la página por defecto. Cada visitante ve ahora la tarifa correcta.
Continuación del caso 1.1 — Riad pasa del almacenamiento de datos a las decisiones.
1. if/elseif/else y falsy
Las condiciones hacen tomar decisiones: if (condición) { … }, ampliado por else (si no) y elseif (si no, si). La condición se evalúa a true/false — normalmente una comparación ($age >= 18) o una combinación lógica. Cuidado con los valores « falsy » (false, 0, cadena vacía, '0', null, array vacío = « falso »): pueden causar errores sutiles. Construya sus condiciones con === y la lógica (&& || !).
Riad sustituye su if ($profil) por una prueba explícita: el código « 0 » ya no se confunde con una ausencia — las tarifas se aplican al visitante correcto.
2. switch, ternario, ?? y match
El switch compara UNA variable con varios valores (más legible que una cascada) — no olvide los break (si no se « cae » en el siguiente case). El ternario es un if/else corto que devuelve un valor ($statut = $age >= 18 ? 'majeur' : 'mineur';). PHP moderno: ?? (fusión null, para los valores por defecto — solo se activa con null/ausencia) y match (PHP 8+, switch estricto que devuelve un valor). En las plantillas: sintaxis alternativa if (…): … endif;.
Riad deriva sus tres perfiles con un switch (break en todas partes), fija la página por defecto con $_GET['page'] ?? 1, y mañana lo simplificará en match estricto.
El switch sin break (no haga nunca esto)
Moraleja: un break olvidado cuesta una tarifa, una prueba imprecisa cuesta un cliente.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — La herramienta adecuada según el caso
Legibilidad ante todo, como Riad para sus tarifas.
$statut = $age >= 18 ? 'majeur' : 'mineur'; // ternario
$page = $_GET['page'] ?? 1; // ??: defecto si ausente
$prix = match($taille) { // match (PHP 8)
'S' => 10,
'M' => 15,
'L' => 20,
default => 0
};
Lectura: cada estructura expresa claramente su intención: asignar, defecto, derivación que devuelve.
Lección: ?? solo se activa con null/ausencia (no con 0 o '') — preciso para los defectos.
Vocabulario de la sección
- if / elseif / else
- Ejecuta un bloque SI una condición es verdadera; else (si no), elseif (si no, si, varias condiciones en cascada). La condición se evalúa a true/false.
Ejemplo sencillo: La mención según la nota escrita por Riad (if/elseif/else).
Lo que no es: una cascada de ternarios anidados ilegibles.
Reflejo: condiciones variadas = if/elseif, una rama por caso.
- Valores « falsy »
- Valores considerados « falsos » por PHP en una condición: false, 0, cadena vacía, '0', null, array vacío; el resto es « verdadero ».
Ejemplo sencillo: El código de perfil « 0 » de Riad, tratado erróneamente como ausente.
Lo que no es: creer que toda cadena no vacía es verdadera (salvo '0').
Reflejo: probar explícitamente: isset, !== '', === 0.
- switch
- Compara UNA variable con varios valores (case), más legible que una cascada de elseif; el break sale del switch (olvidarlo hace caer en el siguiente case); default para los demás casos.
Ejemplo sencillo: Los tres perfiles de tarifa derivados por Riad.
Lo que no es: un switch sin break que ejecuta dos tarifas a la vez.
Reflejo: un case = un break, siempre un default.
- Ternario
- Atajo if/else que devuelve un valor: condición ? valorSiVerdadero : valorSiFalso. Práctico para las asignaciones condicionales cortas.
Ejemplo sencillo: El $statut mayor/menor de Riad en una línea.
Lo que no es: tres ternarios anidados para las tarifas.
Reflejo: simple y corto = ternario; complejo = if/else.
- Fusión null ?? / match
- ?? devuelve la izquierda si existe y no es null, si no la derecha (valores por defecto). match (PHP 8+) = switch moderno, estricto, que devuelve un valor.
Ejemplo sencillo: La $_GET['page'] ?? 1 y el match de tallas de Riad.
Lo que no es: ?: para un defecto que machaca el 0 introducido.
Reflejo: defecto sobre ausencia = ??; derivación que devuelve = match.
En la práctica — En la práctica — Hacer que el código tome decisiones
- Escriba una condición if/elseif/else (ej. determinar una mención según una nota); construya la condición con comparaciones (===, >=…) y lógica (&&, ||).
- Use un switch para comparar una variable con varios valores (¡no olvide los `break`!) con un caso `default`.
- Escriba un ternario para una asignación condicional corta (`$statut = $age >= 18 ? 'majeur' : 'mineur';`).
- Pruebe el operador `??` para un valor por defecto (ej. recuperar un parámetro ausente), y localice la sintaxis alternativa `if (...): ... endif;` para las plantillas.
Script listo para decir — explicar la elección de la estructura (30 s)
« Para estos tres perfiles, propongo un switch: derivamos una sola variable sobre valores exactos, es más legible que una cascada de elseif. Y para la página por defecto, ?? basta — solo se activa si el parámetro falta, sin machacar un 0 legítimo. »
Para decir en revisión de código; mostrar la tabla if/switch/ternario/match/??.
Modelo copiar-pegar — tarifas según el perfil (switch + ?? + ternario)
= 18) ? 'majeur' : 'mineur';
echo 'Tarif : ' . $tarif . ' — ' . $mention;
Tarifas en Constantine
Como Riad: un switch por perfil con break y default — añadir un perfil es añadir un case, sin tocar los demás.
Parámetro ausente
$_GET['page'] ?? 1 da la página por defecto solo en caso de ausencia — el 0 explícito de una paginación sigue respetado.
Etiqueta en una línea
Un ternario para mayor/menor: una asignación simple que cabe en una línea legible, sin bloque if/else.
Subida a match
En PHP 8+, convertir el switch en match: comparación estricta, valor devuelto, ningún break que olvidar.
✓ Buenas prácticas
- if/elseif para las condiciones variadas; switch/match para derivar sobre una variable.
- Ternario para una asignación SIMPLE; nunca anidado (ilegible).
- Usar ?? para los valores por defecto (preciso sobre null/ausencia).
✗ Errores frecuentes
- Olvidar un break en un switch (« fall-through » en el siguiente case).
- Apoyarse en if ($x) y chocar con los valores falsy (0, '0', '').
- Apilar ternarios anidados (preferir un if/else claro).
Puntos clave
- Las CONDICIONES hacen tomar decisiones: `if (condición) { ... }`, ampliado por `else` (si no) y `elseif` (si no, si). La condición se evalúa a true/false (a menudo una comparación).
- Cuidado con los valores « FALSY » (false, 0, cadena vacía, '0', null, array vacío = « falso »); construir sus condiciones con `===` y la lógica (&& || !).
- SWITCH compara una variable con varios valores (más legible que una cascada) — no OLVIDAR los `break` (si no se « cae » en el siguiente case). TERNARIO = if/else corto que devuelve un valor.
- PHP moderno: `??` (fusión null, para los valores por defecto), `match` (PHP 8+, switch estricto que devuelve un valor). Sintaxis alternativa `if (...): ... endif;` para las plantillas HTML.
Reto 48h — aplique mañana
Tome el modelo anterior: añada un 4.º perfil (un case + break), sustituya una cascada de elseif por un switch, y convierta una asignación simple en ternario. Verifique cada perfil en local. 20 minutos bastan.
- Elijo if/elseif, switch, ternario, match o ?? según la intención.
- Nunca olvido los break y pruebo explícitamente los falsy.
- He escrito ?? para un defecto y un ternario para una asignación corta.
Preguntas frecuentes
¿Cuándo usar if/elseif, switch, ternario o match — cómo elegir la estructura correcta?
if/elseif/else: el caso general, para condiciones VARIADAS (comparaciones complejas, combinaciones lógicas, rangos). switch: para comparar UNA variable con varios valores EXACTOS — más legible que una cascada; atención, compara en `==` (flexible) y hacen falta los `break`. Ternario: para un if/else SIMPLE que DEVUELVE un valor — nunca anidado. match (PHP 8+): switch moderno que DEVUELVE un valor, compara en ESTRICTO, sin `break`. `??`: para los VALORES POR DEFECTO. El principio rector: elegir la estructura que exprese más claramente la intención — la legibilidad manda.
¿Qué son los valores « falsy » en PHP, y por qué pueden causar errores?
En un contexto booleano, PHP evalúa la « verdad » de los valores. FALSY: `false`, `0` y `0.0`, `''`, `'0'` (¡la trampa!), `null`, `[]`. La trampa de `'0'`: verificar un campo con `if ($_POST['champ'])` falla si el usuario introdujo « 0 ». Sea EXPLÍCITO: `isset($x)`, `$x !== ''`, `$x === 0` — y `??` para los defectos, que solo se activa con null/ausencia.
¿Qué valor considera PHP « falsy » (falso) de forma tramposa?