1.2 · Condicionales: if/else, switch, ternario

Nivel 1 · Fundamentos del lenguaje

1.2Condicionales: if/else, switch, ternario

Objetivo: hacer que su código tome decisiones con if/elseif/else, switch y el ternario (más ?? y match), construyendo condiciones justas — el fundamento de toda lógica.
Tiempo estimado: 10 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

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.

Error frecuente de interpretación: « if ($x) basta para probar un valor » o « ?? y ?: son equivalentes ». No. if ($x) trata 0, '0', '' y null del mismo modo (falsy): un valor legítimo « 0 » se confunde con una ausencia — pruebe explícitamente (isset, !== '', === 0). Y ?? solo se activa con null/ausencia, mientras que ?: se activa con todo falsy: para un valor por defecto que respete el 0 introducido, hay que usar ?? .
Las estructuras condicionales Elegir según la intención if / elseif / else Condicionesvariadas, rangos, lógicaswitch / match Derivar sobre losvalores de una variableTernario / ?? Asignacióncorta, valor por defecto
Elegir según la intención
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Decidir: Riad escribe if/elseif/else para las condiciones variadas (edad, país) con comparaciones estrictas. 2) Derivar: pasa los tres perfiles al switch (break obligatorios) o al match estricto que devuelve la tarifa. 3) Acortar: ternario para la etiqueta en una línea, ?? para la página por defecto (null/ausencia). Lección: la estructura que exprese más claramente la intención — la legibilidad manda.

El switch sin break (no haga nunca esto)

« Olvidé un break, pero no cambia nada, ¿no? »
Veredicto: sí — la ejecución cae en el siguiente case y el visitante paga la tarifa del vecino.
« if ($code) basta para verificar el código promocional. »
Veredicto: el código « 0 » pasa por ausente — y el cliente que tenía razón se va sin descuento.

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

  1. 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 (&&, ||).
  2. Use un switch para comparar una variable con varios valores (¡no olvide los `break`!) con un caso `default`.
  3. Escriba un ternario para una asignación condicional corta (`$statut = $age >= 18 ? 'majeur' : 'mineur';`).
  4. Pruebe el operador `??` para un valor por defecto (ej. recuperar un parámetro ausente), y localice la sintaxis alternativa `if (...): ... endif;` para las plantillas.
Hace que su código tome decisiones con if/elseif/else, switch y el ternario (más ?? y match), construyendo condiciones justas — el fundamento de toda lógica.

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.

Lista de salida de la sección
  • 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.
Autoevaluación 1-5: ¿mis condiciones distinguen ausencia y valor falsy?¿cada estructura expresa claramente su intención?

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.

Comprueba tu comprensión

¿Qué valor considera PHP « falsy » (falso) de forma tramposa?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 1Preguntas inéditas y más difíciles para validar tus conocimientos