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".