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
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.
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.
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íntoma
Causa
Solución
Un elseif nunca se ejecuta
Una condición anterior más amplia lo cubre
Ordena de la más exigente a la menos
Una línea se ejecuta aunque la condición sea falsa
if sin llaves: solo controla la primera línea
Llaves siempre
Unclosed '{' on line N
Falta la llave de cierre del bloque que empieza en la línea N
Cierra 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 vista
Falta el endif;
Cada if (…): necesita su <?php endif; ?>
Checkpoint
Intenta responder antes de desplegar cada pregunta.
Con $nota = 4.0, ¿qué imprime un if ($nota > 4.0)?
Nada: 4.0 > 4.0 es falso. Para incluir el 4,0 la condición tiene que ser >=.
Tu elseif ($nota >= 6.0) nunca se ejecuta. ¿Qué revisas?
Las condiciones de arriba. Si antes hay un if ($nota >= 4.0), cualquier nota
sobre 6 ya entró ahí. Hay que poner primero la condición más exigente.
¿Por qué en una vista conviene if (…): con endif; en vez de llaves?
Porque entre bloques de HTML, un <?php } ?> no dice qué está cerrando. endif;
sí, y hace más fácil encontrar un bloque sin cerrar.
¿Es seguro ocultar un mensaje con la clase hidden desde PHP?
No. El HTML llega igual al navegador y se puede ver con F12. Lo que no se debe
mostrar, PHP no lo imprime.