Un if ejecuta un bloque de código solo si una condición es verdadera. Con elseif y else se arman caminos alternativos: el programa recorre las condiciones de arriba hacia abajo y entra en la primera que se cumpla.

La estructura

Cómo recorre PHP un if, elseif y else

flowchart TD
    A["$nota"] --> B{"¿$nota >= 6.0?"}
    B -->|sí| C["Excelente"]
    B -->|no| D{"¿$nota >= 4.0?"}
    D -->|sí| E["Aprobado"]
    D -->|no| F["Reprobado"]
    C --> G["Sigue el programa"]
    E --> G
    F --> G
<?php
$nota = 5.2;
 
if ($nota >= 6.0) {
    echo "Excelente\n";
} elseif ($nota >= 4.0) {
    echo "Aprobado\n";
} else {
    echo "Reprobado\n";
}
 
echo "Fin de la revisión\n";
Aprobado
Fin de la revisión
Parte¿Obligatoria?Qué hace
if (condición) { … }SíEntra si la condición es verdadera
elseif (condición) { … }No, puede haber variasSe revisa solo si las anteriores fueron falsas
else { … }No, máximo una, al finalEntra si ninguna condición anterior se cumplió

Solo se ejecuta un camino

Aunque 5.2 >= 4.0 y también 5.2 >= 1.0, solo se ejecuta el primer bloque cuya condición es verdadera. El resto se salta sin revisarse.

El orden de las condiciones

Incorrecto: la condición más amplia primero

<?php
$nota = 6.5;
 
if ($nota >= 4.0) {
    echo "Aprobado\n";
} elseif ($nota >= 6.0) {
    echo "Excelente\n";
}
Aprobado

Un 6,5 también es mayor o igual a 4,0, así que entra en el primer bloque y nunca llega a “Excelente”. Ese elseif no se ejecuta jamás, con ninguna nota.

Correcto: de la más exigente a la menos exigente

<?php
$nota = 6.5;
 
if ($nota >= 6.0) {
    echo "Excelente\n";
} elseif ($nota >= 4.0) {
    echo "Aprobado\n";
}
Excelente

Condiciones compuestas

Se combinan con && (y), || (o) y ! (no), vistos en Operadores.

<?php
$nota = 5.0;
$asistencia = 60;
 
if ($nota >= 4.0 && $asistencia >= 75) {
    echo "Aprobado\n";
} elseif ($nota >= 4.0 && $asistencia < 75) {
    echo "Reprobado por asistencia\n";
} else {
    echo "Reprobado por nota\n";
}
Reprobado por asistencia

Incorrecto: if dentro de if dentro de if

<?php
if ($nota >= 4.0) {
    if ($asistencia >= 75) {
        echo "Aprobado";
    } else {
        echo "Reprobado por asistencia";
    }
} else {
    echo "Reprobado por nota";
}

Funciona, pero cada nivel de anidación hace más difícil seguir qué else corresponde a qué if. Con tres niveles ya no se lee.

Correcto: aplanar con && y elseif

El ejemplo de arriba, con && y elseif, hace lo mismo en un solo nivel. Si puedes escribir la decisión como una lista de casos, escríbela así.

Las llaves

Incorrecto: if sin llaves

<?php
$stock = 0;
 
if ($stock > 0)
    echo "Disponible\n";
    echo "Agregar al carro\n";
Agregar al carro

Sin llaves, el if solo controla la primera línea. La segunda se ejecuta siempre, aunque la indentación diga otra cosa. Mismo comportamiento que en C.

Correcto: llaves siempre

<?php
$stock = 0;
 
if ($stock > 0) {
    echo "Disponible\n";
    echo "Agregar al carro\n";
}

No imprime nada: las dos líneas dependen del if.

Mostrar u ocultar HTML

En una página, lo normal es que la condición decida qué HTML se muestra. Para eso se cierra el bloque PHP dentro del if y se escribe HTML normal. PHP tiene una forma pensada para esto, con : y endif, que se lee mucho mejor entre etiquetas.

<?php $stock = 3; ?>
 
<?php if ($stock > 0): ?>
  <p class="text-green-700">Quedan <?= $stock ?> unidades.</p>
  <button class="bg-sky-700 text-white px-4 py-2 rounded">Comprar</button>
<?php else: ?>
  <p class="text-red-700">Agotado.</p>
<?php endif; ?>

Lo que recibe el navegador con $stock = 3:

  <p class="text-green-700">Quedan 3 unidades.</p>
  <button class="bg-sky-700 text-white px-4 py-2 rounded">Comprar</button>
Con llavesCon dos puntos
if (…) {if (…):
} elseif (…) {elseif (…):
} else {else:
}endif;

Correcto: llaves en código PHP, dos puntos entre HTML

En un archivo que es solo lógica, usa llaves. Cuando el if envuelve HTML, usa if (…): y endif;: en un archivo largo, un <?php } ?> suelto no dice qué está cerrando, y un <?php endif; ?> sí.

Incorrecto: esconder con CSS lo que no se debe mostrar

Poner class="hidden" en el mensaje de “Agotado” y quitarlo con PHP envía igual el HTML al navegador: se ve con F12. Si algo no corresponde mostrarlo, que PHP no lo imprima.

Pruébalo

  • Escribe el clasificador de notas y pruébalo con 6.5, 4.0, 3.9 y 7.0
  • Invierte el orden de las condiciones y comprueba que “Excelente” nunca aparece
  • Haz una página con un bloque if (…): … endif; y cambia la variable para ver los dos casos en el navegador
  • Mira el código fuente: el bloque que no se cumplió no está
  • Error provocado: borra la llave de cierre del if y lee el error

Errores comunes

SíntomaCausaSolución
Un elseif nunca se ejecutaUna condición anterior más amplia lo cubreOrdena de la más exigente a la menos
Una línea se ejecuta aunque la condición sea falsaif sin llaves: solo controla la primera líneaLlaves siempre
Unclosed '{' on line NFalta la llave de cierre del bloque que empieza en la línea NCierra la llave; la indentación ayuda a encontrarla
syntax error, unexpected token "else"Un ; justo después del if (…) o del }Quita el ;: if (…) { no lleva punto y coma
syntax error, unexpected end of file en una vistaFalta el endif;Cada if (…): necesita su <?php endif; ?>

Checkpoint

Intenta responder antes de desplegar cada pregunta.