if (condizione) { ... } esegue il suo blocco solo quando la condizione è vera. Aggiungi elseif (altra condizione) { ... } per altri casi ed else { ... } per tutto il resto. PHP controlla le condizioni dall'alto ed esegue solo il primo blocco che corrisponde.
Cambia $temperature ed eseguilo di nuovo. Dato che i controlli vanno dall'alto verso il basso, 24 si ferma alla seconda condizione e non arriva mai a >= 10, anche se anche quella è vera. Ordina le condizioni dalla più specifica alla più generale.
elseif vs else if
Con le parentesi graffe, elseif ed else if fanno la stessa cosa. Tecnicamente else if è un else il cui corpo è un nuovo if, ma il risultato è identico.
La differenza compare solo con la sintassi con i due punti usata nei template (sezioni seguenti). Lì else if rompe il codice:
<?php $score = 72; ?>
<?php if ($score >= 90): ?>
<p>A</p>
<?php else if ($score >= 60): ?>
<p>Passed</p>
<?php endif; ?>
PHP Parse error: syntax error, unexpected token "if", expecting ":" in /home/index.php on line 4
Scrivi elseif come una sola parola e quell'errore non lo incontrerai mai.
Condizioni multiple con && e ||
&& (and) richiede che entrambi i lati siano veri, || (or) ne richiede almeno uno e ! inverte una condizione. PHP smette di valutare appena la risposta è nota, quindi in $user !== null && $user['active'] la seconda parte viene eseguita solo quando c'è un utente.
Quando mescoli && e ||, aggiungi le parentesi: && ha la precedenza, e le parentesi rendono evidente l'intenzione a chi legge dopo. PHP ha anche le parole chiave and e or, ma hanno una priorità più bassa di =, quindi $ok = true and false; imposta $ok a true. Resta su && e ||.
Cosa conta come vero in un if
La condizione non deve per forza essere un booleano. PHP la converte, e alcuni valori contano come falsi: false, 0, 0.0, "", "0", [] e null. Tutto il resto è vero, compresi "false", " " e "0.0".
| $x | bool | empty |
|---|---|---|
| false | ||
| 0 | ||
| 0.0 | ||
| "" | ||
| "0" | ||
| null | ||
| [] | ||
| " " | ||
| "0.0" | ||
| "a" | ||
| [0] | ||
| 1 |
Ecco perché if ($items) è un modo comune per dire "l'array non è vuoto". La riga di "0" è quella che fa danni: un campo di un form in cui qualcuno ha scritto 0 è una stringa non vuota, eppure if ($_POST['qty']) la tratta come falsa. Confronta esplicitamente (if ($qty !== '')) quando lo zero è una risposta valida. Le stesse regole decidono cosa restituisce empty().
if else nell'HTML con if: ed endif;
Tra i tag HTML è facile perdere le parentesi graffe. PHP ha una sintassi alternativa: i due punti dopo la condizione, elseif ...: ed else: per gli altri rami, ed endif; alla fine. Esegui questo blocco, poi clicca sui punteggi nella scheda Page: ogni link esegue di nuovo lo stesso script con un nuovo $_GET['score'].
<?= $score ?> è la forma breve di <?php echo $score; ?>. Lo stesso stile con i due punti esiste per i cicli (foreach: endforeach;, while: endwhile;) ed è quello che usa la maggior parte dei template PHP.
if su una riga e operatore ternario
Una singola istruzione può seguire la condizione senza graffe. Funziona, ma la prossima riga che aggiungi non sarà dentro l'if, quindi molte guide di stile richiedono sempre le graffe. Per scegliere uno tra due valori, l'operatore ternario è più breve di un if/else completo.
Quando ci sono molti valori esatti da confrontare con una variabile, un'espressione match si legge meglio di una lunga catena di elseif.
Uscire subito invece di annidare
I blocchi if annidati in profondità sono difficili da seguire. Dentro una funzione, controlla prima i casi di errore e fai subito return. La logica principale resta così sul margine sinistro.
Errore comune: = invece di == in una condizione
Un solo = assegna. if ($role = 'admin') salva 'admin' in $role e poi verifica quella stringa, che è vera. Il blocco viene eseguito per ogni utente, e ora anche $role è sbagliato.
Usa === per i confronti a meno che tu non voglia di proposito la conversione di tipo. Alcuni scrivono prima la costante (if ('admin' === $role)), così un = mancante diventa un errore invece di un'assegnazione silenziosa.
Domande frequenti
Qual è la differenza tra elseif ed else if in PHP?
Con le parentesi graffe si comportano allo stesso modo: else if è un else il cui corpo è un altro if. Con la sintassi con i due punti (if (...): ... endif;) funziona solo elseif, ed else if è un errore di parsing. Usare sempre elseif evita la differenza.
Come controllo più condizioni in un if in PHP?
Uniscile con && (devono essere tutte vere) o || (almeno una): if ($age >= 18 && $hasTicket) { ... }. Usa le parentesi quando mescoli i due, per esempio if ($isAdmin || ($isOwner && $isActive)).
Come scrivo un if su una sola riga in PHP?
Una singola istruzione può seguire la condizione senza graffe: if ($debug) echo 'debug mode';. Per scegliere tra due valori in una riga usa l'operatore ternario: $label = $count === 1 ? 'item' : 'items';.
Come uso if else dentro l'HTML in PHP?
Usa la sintassi alternativa, che si legge bene tra i tag HTML: <?php if ($loggedIn): ?> <p>Welcome back</p> <?php else: ?> <a href="/login">Log in</a> <?php endif; ?>.