Istruzioni condizionali: if, else, elseif, switch

Istruzioni condizionali: if, else, elseif, switch

Come la maggior parte dei linguaggi di programmazione, anche PHP consente di scrivere codice che esegue azioni in base ai risultati di condizioni logiche o comparative.

Ciò significa che è possibile creare condizioni di test sotto forma di espressioni che valutano sia true che false e, in base a queste, eseguire determinate azioni.

È possibile farlo tramite le istruzioni condizionali del linguaggio.

Vediamo sintassi ed esempi di utilizzo per ciascuna di esse.

Istruzione if

La più semplice istruzione condizionale PHP è l'istruzione if , che viene utilizzata per eseguire un blocco di codice solo se la condizione specificata è vera.

Di seguito un esempio che ne descrive il funzionamento:

<?php
$x = 10;
$y = 8;

if ($x > $y) {
    echo "$x è maggiore di $y"; // 10 è maggiore di 8
}

L'istruzione if è seguita da una condizione racchiusa tra parentesi tonde. Le successive righe, racchiuse tra parentesi graffe, rappresentano il blocco di codice da eseguire se la condizione viene valutata come vera.

Nota: le parentesi graffe possono essere omesse nel caso il blocco di codice sia composto da una singola istruzione, ma per chiarezza è buona prassi aggiungerle sempre.

La condizione deve dare come risultato un valore booleano, dunque per essere interpretata come tale da PHP, si devono usare gli operatori di confronto esaminati nella guida dedicata agli operatori PHP.

Adesso aggiungiamo un'ulteriore istruzione che ci consente di gestire la situziazione nel caso in cui la condizione fosse false.

Istruzione else

È possibile migliorare il codice precedente aggiungendo un'altra istruzione che fornisce una scelta alternativa. L'istruzione if-else consente di eseguire un blocco di codice se la condizione specificata viene valutata true e un altro blocco di codice se viene valutata false.

Modificando l'esempio precedente possiamo scrivere:

<?php
$x = 10;
$y = 14;

if ($x > $y) {
    echo "$x è maggiore di $y";
} else {
    echo "$x è minore o uguale di $y"; // 10 è minore o uguale di 14
}

Istruzione elseif

È possibile combinare più condizioni tramite l'istruzione elseif (o else if).

Vediamo un esempio

<?php
$day = 'sabato';

if ($day == 'lunedì') {
    echo "Oggi è lunedì";
} elseif ($day == 'martedì') {
    echo "Oggi è martedì";
} elseif ($day == 'mercoledì') {
    echo "Oggi è mercoledì";
} elseif ($day == 'giovedì') {
    echo "Oggi è giovedì";
} elseif ($day == 'venerdì') {
    echo "Oggi è venerdì";
} elseif ($day == 'sabato') {
    echo "Oggi è sabato";
} elseif ($day == 'domenica') {
    echo "Oggi è domenica";
} else {
    echo "Impossibile stabilire che giorno è oggi!";
}
// Output: Oggi è sabato

Operatore ternario

L'istruzione if-else ha una sua forma contratta rappresentata dal simbolo del punto interrogativo ?, detto operatore ternario in quanto richiede tre operandi:

  1. la condizione da verificare
  2. il valore restituito se la condizione è vera
  3. il valore restituito se la condizione è falsa.

Di seguito è mostrato un esempio

<?php
$year = 2020;

echo ($year % 4 == 0) ? "$year è un'anno bisestile" : "$year non è un'anno bisestile"; // 2020 è un'anno bisestile

/* Forma normale

if ($year % 4 == 0) {
    echo "$year è un'anno bisestile";
} else {
    echo "$year non è un'anno bisestile";
}

*/

L'istruzione if è stata sostituita dal punto interrogativo, mentre i due punti prendono il posto dell'istruzione else.

Nella condizione abbiamo utilizzato l'operatore modulo %, tramite il quale verifichiamo che il resto della divisione tra la variabile $year e 4 sia uguale a 0. La condizione è valutata vera, dunque viene stampato 2020 è un'anno bisestile.

Se avessimo utilizzato la versione normale, avremmo scritto 5 righe di codice anzichè una, come mostrato in fondo all'esempio.

Nota: l'operatore ternario consente di ridurre la scrittura di codice. Tuttavia è buona norma utilizzarlo per istruzioni non particolarmente complesse, per una questione di leggibilità del codice.

Istruzione switch

L'istruzione switch rappresenta un'alternativa più leggibile nel caso volessimo concatenare più istruzionielseif.

L'istruzione switch verifica una variabile rispetto a una serie di casi (case) finché trova una corrispondenza, quindi viene eseguito il blocco di codice corrispondente.

Possiamo riscrivere l'esempio dell'istruzione elseif utilizzando lo switch e il costrutto case in questo modo

<?php
$day = 'sabato';

switch ($day) {
    case 'lunedì':
        echo "Oggi è lunedì";
        break;
    case 'martedì':
        echo "Oggi è martedì";
        break;
    case 'mercoledì':
        echo "Oggi è mercoledì";
        break;
    case 'giovedì':
        echo "Oggi è giovedì";
        break;
    case 'venerdì':
        echo "Oggi è venerdì";
        break;
    case 'sabato':
        echo "Oggi è sabato";
        break;
    case 'domenica':
        echo "Oggi è domenica";
        break;
    default:
        echo "Impossibile stabilire che giorno è oggi!";
}
// Output: Oggi è sabato

All'interno di ogni caso è presente l'istruzione break, che indica a PHP di saltare alla fine dello switch, una volta eseguito il codice associato al primo caso true.

Se viene omesso il break, PHP esegue anche tutti i casi successivi fino alla fine del blocco switch. Dunque per evitare comportamenti inattesi è importante inserire sempre l'istruzione break alla fine di ciascun case.

Sintassi alternativa

Per le istruzioni condizionali, PHP consente una sintassi alternativa, che consiste nel sostituire la parentesi graffa di apertura con il carattere dei due punti (:), e la parentesi di chiusura con endif nel caso dell'istruzione if.

Si può applicare in ugual modo all'istruzione switch, con la parentesi di chiusura sostituita da endswitch.

La sintassi alternativa viene utilizzata per dare maggiore chiarezza al codice, sopratutto nel caso di programmi contenenti sia codice PHP che HTML, come mostrato nell'esempio:

<?php
$isLogged = true;
?>
<html>
<body>
    <h1>
    <?php if ($isLogged):?>
        Utente loggato
    <?php else:?>
        Utente non loggato
    <?php endif;?>
    </h1>
</body>
</html>