Luca Bigon
a- a+

Il costrutto IF

Questo tutorial è stato scritto dal docente che curerà il corso di PHP organizzato da WebMasterPoint.org - Nel corso delle lezioni si partirà dalle basi(come in questo articolo) fino ad arrivare ad articoli su argomenti più complessi. Per iscriverti al corso clicca qui.

IF, dall'inglese SE, è un costrutto molto importante che ci permette di eseguire del codice SE, al verificarsi, di alcune condizioni.
Mettiamo il caso di voler scrivere un messaggio di benvenuto in base al tema utilizzato nel nostro sito.
Quindi se il tema da noi utilizzato è uguale a 0 (il primo tema), stamperemo la frase "questo è il mio primo tema" altrimenti se il tema utilizzato è uguale a 1 stamperemo la frase "il mio secondo tema utilizza colori più accesi". Cosa bisogna scrivere?
Studiamoci prima la sintassi del costrutto IF:

if (condizione è vera) {
esegui solo se la condizione è vera
} elseif (condizione2 è vera) {
esegui solo se la condizione2 è vera
} else {
esegui solo se nessuna delle condizioni precedenti sono vere
}
?>



All'interno delle parentesi tonde vanno inserite le domande da porre al nostro PHP utilizzando gli operatori di confronto. Nel caso in cui la domanda sia vera (quindi se viene restituito il valore booleano TRUE) viene eseguito il codice presente all'interno delle parentesi graffe altrimenti si passa al controllo successivo.
Una volta capito questo ci risulterà semplice scrivere il codice del costrutto IF necessario per stampare il messaggio di benvenuto personalizzato.
Prima di tutto bisogna controllare se la variabile "tema" è uguale a 0 e poi bisogna controllare se la variabile "tema" è uguale a 1.

if($tema == 0) {
echo "questo è il mio primo tema";
} elseif($tema == 1) {
echo "il mio secondo tema utilizza colori più accesi";
}
?>


Aprite quindi il file index.php e dopo aver dichiarato la variabile "tema" copiate il codice riportato qui sopra. Una volta fatto provate a caricare la vostra index e a cambiare il valore della variabile "tema". Come potete vedere vi verrà stampato, come si desiderava, un messaggio personalizzato in base al tema da noi utilizzato.
Proviamo ora a realizzare una piccola calcolatrice la quale, a seconda del valore della variabile "operazione" può eseguire la somma, la differenza, la moltiplicazione o la divisione di due numeri dichiarati all'interno del programma.

$operazione = "somma";
$num1 = 13;
$num2 = 8;
if($operazione == "somma") {
echo "eseguo la somma tra $num1 e $num2. Il risultato è ";
echo 13+8;
} elseif($operazione == "differenza") {
echo "eseguo la differenza tra $num1 e $num2. Il risultato è ";
echo 13-8;
} elseif($operazione == "moltiplica") {
echo "eseguo la moltiplicazione tra $num1 e $num2. Il risultato è ";
echo 13*8;
} elseif($operazione == "dividi") {
echo "eseguo la divisione tra $num1 e $num2. Il risultato è ";
echo 13/8;
} else {
echo "attenzione: hai sbagliato a scrivere la variabile $operazione!
";
}
?>


In questo caso abbiamo preso in considerazione 5 casi diversi:
il primo controlla se "operazione" è uguale alla stringa "somma"; se lo è viene eseguita la somma.
Il secondo controlla se "operazione" è uguale a "differenza"; se lo è esegue l'operazione richiesta.
Il terzo controlla se "operazione" è uguale a "moltiplica"; se lo è esegue la moltiplicazione.
La quarta controlla se "operazione" è uguale a "dividi"; se lo è esegue l'operazione. 
L'ultimo controllo viene eseguito solo nel caso in cui tutte le condizioni precedenti risultino false. Quindi possiamo dedurre che "operazione" non è uguale a "somma" o a "differenza" o a "moltiplica" o a "dividi"; quindi in questo caso stampiamo un messaggio che avverte il programmatore che la variabile non ha assunto un valore corretto.

Proviamo ora a pensare a un programma che verifica in quale categoria deve rientrare un determinato prodotto. 
Nel caso in cui l'id del prodotto sia compreso tra 0 e 20 allora siamo di fronte ad un prodotto alimentare. Nel caso il cui l'id sia compreso tra 21 e 36 o sia compreso tra 52 e 70 allora il prodotto è un elettrodomestico. Negli altri casi il prodotto rientra nella categoria degli utensili.
Come possiamo tradurre tutte queste condizioni in codice? 
Questo esempio è leggermente più complesso rispetto all'esempio della calcolatrice; infatti ora si esegue del codice solo nel caso in cui l'id sia maggiore e uguale di un numero e contemporaneamente sia minore e uguale di un'altro numero. Quindi all'interno delle parentesi rotonde siamo costretti a specificare due condizioni di controllo. Per fare ciò è necessario studiare almeno due operatori logici:

AND
L'operatore AND (nel PHP si scrive "&&") fa si che un'espressione sia vera solo nel caso in cui tutte le condizioni al suo interno risultino vere. Se anche solo una di queste risulta falsa allora tutta l'espressione risulta falsa. Per esempio:
se "var01" è uguale a 10 e "var02" è uguale a 14 allora stampa "ciao".
Quello che vedete qui sopra non è il codice sorgente scritto in PHP ma è una pseudo-codifica del codice, cioè il codice tradotto in un linguaggio più comprensibile per noi poveri umani.
In questo caso viene stampato "ciao" solo se "var01" è uguale a 10 e contemporaneamente "var02" è uguale a 14; in caso contrario non viene stampato nulla.

If ($var01 == 10 && $var02 == 14) {
echo "ciao";
}
?>


OR
L'operatore OR (nel PHP si scrive "||") fa si che un'espressione sia vera anche nel caso in cui una o più delle sue condizioni siano false; basta che solo una di queste sia vera per rendere vera l'intera espressione. Per esempio:
se "var01" è uguale a 10 o "var02" è uguale a 14 allora stampa "ciao".
In questo caso se "var01" vale 10 e "var02" vale 3 allora ci verrà stampata la stringa "ciao".

If ($var01 == 10 || $var02 == 3) {
echo "ciao";
}
?>


Ora che sappiamo come gestire più richieste contemporaneamente possiamo procedere alla realizzazione del nostro semplice programma di gestione dei prodotti.
Qui sotto sono schematizzate le condizioni necessarie per lo svolgimento del programma:

Se num è maggiore e uguale a 0 e minore e uguale a 20 allora è un alimentare
Se num è maggiore e uguale a 21 e minore e uguale a 36 allora è un elettrodomestico
Se num è maggiore e uguale a 52 e minore e uguale a 70 allora è un elettrodomestico
Altrimenti è un utensile

Proviamo a tradurre queste frasi in condizioni di controllo valide per il PHP:

($num >= 0 && $num <= 20)

Se è vero allora viene stampata la parola "alimentare". Questo è vero solo se il valore contenuto in $num è maggiore e uguale a 0 e contemporaneamente è minore e uguale a 20. Per esempio se "num" vale 10 mi viene restituito il valore booleano TRUE. Se invece "num" vale 33 mi viene restituito il valore booleano FALSE.

($num >= 21 && $num <= 36)

Se è vero allora mi stampa la parola "elettrodomestico"

($num >= 52 && $num <= 70)

Anche in questo caso mi viene stampata la parola "elettrodomestico"
caso ELSE
In questo ultimo caso possibile mi viene stampato "utensile".
Procediamo ora alla stesura del costrutto IF necessario per la realizzazione del nostro programma:

$num = 43;
if($num >= 0 && $num <= 20)
echo "alimentare";
elseif($num >= 21 && $num <= 36) {
echo "elettrodomestico";
} elseif($num >= 52 && $num <= 70) {
echo "elettrodomestico";
} else
echo "utensile";
?>


Ed ecco tradotto il nostro programma in codice PHP. Il programma funziona anche se apparentemente sembra ci sia un errore di sintassi. Infatti la prima parte di codice non riporta le parentesi graffe come invece è riportato nel riquadro della sintassi del costrutto IF. Il PHP infatti ci permette di omettere le graffe nel caso in cui si voglia eseguire una sola istruzione al verificarsi della condizione; quindi non abbiamo sbagliato nulla!
Continuiamo a esaminare il nostro programma e cerchiamo di utilizzare meno codice possibile a fronte però di una minore leggibilità del codice stesso.
Se guardiamo bene infatti stampiamo due volte la parola "elettrodomestico". Nel primo caso viene stampato se "num" è compreso tra 21 e 36 e nel secondo caso se "num" è compreso tra 52 e 70.
Come possiamo allora tradurre il tutto in un'unica riga di codice? Molto semplicemente basta unire le due espressioni da un operatore logico. Quale tra AND e OR?
Ecco il codice:

($num >= 21 && $num <= 36) ?? ($num >= 52 && $num <= 70)

al posto dei punti di domanda bisogna inserire il nostro operatore. Proviamo a studiare cosa succede se utilizziamo l'operatore logico AND "&&":

$num = 24;
(24 >= 21 && 24 <= 36) && (24 >= 52 && 24 <= 70)
(TRUE && TRUE) && (FALSE && TRUE)
(TRUE) && (FALSE)
FALSE


Quindi se utilizziamo l'operatore AND e "num" è compreso tra 21 e 36 (nel nostro caso vale 24) ci verrà restituito il valore booleano FALSE, quindi non verrà mai stampata la parola "elettrodomestico". Non ci resta quindi da provare ad usare l'operatore OR:

$num = 24;
(24 >= 21 && 24 <= 36) || (24 >= 52 && 24 <= 70)
(TRUE && TRUE) || (FALSE && TRUE)
(TRUE) || (FALSE)
TRUE


In questo caso invece ci viene restituito il valore TRUE quindi ci verrà stampata la parola "elettrodomestico". Ecco quindi il nuovo codice del nostro programma:

$num = 43;
if($num >= 0 && $num <= 20) {
echo "alimentare";
} elseif(($num >= 21 && $num <= 36) || ($num >= 52 && $num <= 70)) {
echo "elettrodomestico";
} else
echo "utensile";
?>


Realizziamo ora un terzo programma che restituisce un valore al verificarsi di una precisa condizione altrimenti, se la condizione risulta falsa, restituisce un secondo valore diverso dal primo.
La sintassi da usare è la seguente:

if(espressione)
codice;
else
codice;
?>

Questa è la versione estesa ma esiste anche una versione abbreviata che ci permette di ottenere lo stesso risultato con una sola riga di codice. Ecco come:

operazione (espressione) ? "Codice vero" : "codice falso";
?>

dove operazione è l'operazione da compiere (stampare con "echo" o salvare il valore restituito in una variabile con "$var ="), espressione è la nostra espressione logica da eseguire la quale se è vera restituisce "Codice vero" altrimenti restituisce "codice falso". Sembra molto complesso da capire ma con un po di pratica tutto diventa più semplice.

$num = 4;
if($num > 3)
echo "maggiore di tre";
else
echo "minore o uguale a tre";
echo "

caso due:


";
echo ($num > 3) ? "maggiore di tre" : "minore o uguale a tre";
?>


Il valore restituito è il medesimo anche se nel primo caso abbiamo scritto quattro righe di codice contro la sola riga di codice necessaria per il secondo caso. Ma oltre a guadagnare dello spazio prezioso abbiamo anche appesantito la lettura del codice sorgente del nostro programma; infatti solo una persona esperta o con una buona esperienza in programmazione riesce a intuire immediatamente cosa fa il codice " echo ($num > 3) ? "maggiore di tre" : "minore o uguale a tre" " mentre anche un neo-programmatore riesce in qualche modo a intuire la prima struttura presente nell'esempio 04. Sta a voi quindi scegliere quale delle due strutture utilizzare; in questo corso utilizzeremo sempre la sintassi estesa in quanto risulta più semplice da leggere e da capire. Nessuno però vi vieta di usare la seconda soluzione!
Finora abbiamo visto solo esempi numerici ma le espressioni di confronto possono essere fatte anche su stringhe; ricordatevi però che il PHP è Case-Sensitive cioè fa differenza tra una stessa parola scritta con lettere maiuscole o minuscole. Ecco un semplice esempio:

$str = "Ciao";
echo ($str == "Ciao") ? "sono uguali

" : "sono diversi

";
echo ($str == "ciao") ? "sono uguali

" : "sono diversi

";
?>


Nel primo caso ci viene restituita la stringa "sono uguali" mentre nel secondo caso ci restituisce la stringa "sono diversi". Infatti "Ciao" è diverso da "ciao".




Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Francesco
Hai dubbi su questo articolo?