PHP – Lezione 4 - Luca Andrea Ludovico

Transcript

PHP – Lezione 4 - Luca Andrea Ludovico
Università degli Studi di Milano
Dipartimento di Informatica e Comunicazione
Corso di Laurea in Scienze e Tecnologie della Comunicazione Musicale
Informatica Generale - Prof. Luca A. Ludovico
PHP – Lezione 4
Istruzione condizionale IF
Sintassi IF:
if (condizione)
{
istruzioni;
}
Osservazioni:
• cosa succede se la condizione non è verificata;
• quando si possono omettere le parentesi graffe.
Sintassi IF- ELSE:
if (condizione)
{
istruzioni;
}
else
{
istruzioni;
}
Esempio:
if ($eta >= 18)
echo "Sei maggiorenne";
else
echo "Sei minorenne";
Sintassi IF-ELSEIF:
if (condizione1)
{
istruzioni1;
}
elseif (condizione2)
{
istruzioni2;
}
elseif (condizione3)
{
istruzioni3;
}
//...
else
{
istruzionin;
}
L’else finale è opzionale, anche se consigliabile per gestire tutti i casi non esplicitamente trattati tramite i
precedenti rami.
Osservazioni conclusive:
• annidamento di IF;
• problema del dangling ELSE (ELSE pendente).
Condizioni in PHP
Operatori di confronto: ==, !=, <, >, <=, >=
Operatori logici: AND (oppure &&), OR (oppure ||), NOT (oppure !), XOR
Equivalenza tra valori booleani di verità true e false e valore delle costanti/variabili (0 e stringa vuota
equivalgono a false, tutto il resto a true).
Osservazioni:
• differenze tra l’operatore di assegnamento = e di confronto ==;
• verifica delle condizioni sulla base del valore di verità di una variabile o di una istruzione. Esempi:
o
o
o
o
if
if
if
if
(1) ...
(true) ...
($numero) ...
(strlen ("Pluto")) ...
Esempi:
if ($eta != 17)
echo "Non hai 17 anni";
equivalente a
if (!($eta == 17))
echo "Non hai 17 anni";
if ($eta > 12 && $eta < 20)
echo "Sei un teeenager";
elseif ($eta >= 18)
echo "Sei maggiorenne";
if ((strlen("Pluto") and 3) xor 1)
echo "Valore di verità TRUE";
else
echo "Valore di verità FALSE";
Istruzione condizionale SWITCH
Rende più lineare la sintassi del costrutto IF-ELSEIF quando le condizioni da valutare sono di uguaglianza.
Sintassi SWITCH:
switch ($variabile)
{
case "valore1":
istruzioni1;
break;
case "valore2":
istruzioni2;
break;
...
default:
istruzionin;
break;
}
Osservazioni:
• importanza fondamentale dell’istruzione break; cosa succede quando viene omessa?
• uso della clausola default
o è opzionale
o se presente, deve sempre essere l’ultima
o anch’essa viene chiusa dall’istruzione break, ma solo per coerenza con gli altri rami.
Esempio:
switch ($colore_scelto)
{
case "bianco":
echo "Hai scelto i pezzi bianchi: muovi per primo.";
break;
case "nero":
echo "Hai scelto i pezzi neri: attendi la mossa dell’avversario.";
break;
default:
echo "Hai scelto un colore inesistente: impossibile procedere!";
break;
}
Confronti tra costrutto IF-ELSEIF e SWITCH-CASE
Il costrutto SWITCH-CASE è equivalente a IF-ESLEIF quando in quest’ultimo le condizioni via via da
testare sono sempre confronti di uguaglianza tra una singola variabile data e alcuni suoi possibili valori. Si
vedano al riguardo i due esempi seguenti.
Esempio 1:
if ($seme == 1)
echo "cuori";
elseif ($seme == 2)
echo "quadri";
elseif ($seme == 3)
echo "fiori";
elseif ($seme == 4)
echo "picche";
else
echo "errore";
switch ($seme)
{
case 1: echo "cuori"; break;
case 2: echo "quadri"; break;
case 3: echo "fiori"; break;
case 4: echo "picche"; break;
default: echo "errore"; break;
}
Esempio 2:
$corso = $ GET['corso'];
if ($corso == 1)
echo "Sei iscritto a Informatica";
elseif ($corso == 2)
echo "Sei iscritto a Comunicazione
digitale";
elseif ($corso == 3)
echo "Sei iscritto a STCM";
elseif ($corso == 4)
echo
"Sei
iscritto
a
Ingegneria
Informatica";
else
echo "Sei iscritto a ???";
$corso = $ GET['corso'];
switch ($corso)
{
case 1:
echo "Sei iscritto a Informatica";
break;
case 2:
echo "Sei iscritto a Comunicazione
digitale";
break;
case 3:
echo "Sei iscritto a STCM";
break;
case 4:
echo "Sei iscritto a Ingegneria
Informatica";
break;
default:
echo "Sei iscritto a ???";
break;
}
Ciclo WHILE
Si tratta di un’istruzione iterativa, in quanto ripete ciclicamente una sequenza di istruzioni.
La condizione viene valutata all’ingresso nel ciclo, e si permane nel ciclo finché (= per tutto il tempo in cui)
la condizione risulta verificata (valore di verità TRUE).
Sintassi:
while (condizione)
{
istruzioni;
}
Esempio 1: stampa dei primi 50 numeri
$numero = 1;
while ($numero < 51)
{
echo $numero;
echo "<br />";
$numero++;
}
Esempio 2.a: stampa dei primi 20 numeri pari
$contatore = 1;
while ($contatore <= 20)
{
echo $contatore*2;
echo "<br />";
$contatore++;
}
Esempio 2.b: stampa dei primi 20 numeri pari
$contatore = 1;
$numero = 2;
while ($contatore <= 20)
{
echo $numero;
$numero = $numero + 2;
echo "<br />";
$contatore++;
}
Esempio 3: creazione di un controllo di tipo menù a discesa interno a un form per la scelta del giorno,
compreso tra 1 e 31.
echo "<select name=’day’>";
$giorno = 1;
while ($giorno <= 31)
{
echo "<option value=’$giorno’>$giorno</option>";
$giorno++;
}
echo "</select>";
Osservazione: è fondamentale che all’interno del ciclo vi sia almeno un’istruzione il cui effetto fa variare il
valore di verità della condizione. In caso contrario, il rischio è la generazione di un ciclo infinito.
Analogamente, se la condizione è sempre verificata, in generale il ciclo non avrà termine (es.: while (1)).
CONTINUE e BREAK
L’istruzione continue forza l’uscita dall’iterazione corrente del ciclo e la rivalutazione della condizione
iniziale.
Esempio:
$giorno = 1;
while ($giorno <= 31)
{
if ($giorno == 13 || $giorno == 17)
{
$giorno++;
continue;
}
echo "$giorno<br />";
$giorno++;
}
Il precedente ciclo visualizza tutti i giorni da 1 a 31 saltando però il giorno 13 e il giorno 17. Si osservi che
se all’interno dell’if non si fosse incrementata $giorno, avrebbe avuto luogo un ciclo infinito.
Inoltre, si osservi come in generale l’istruzione continue si debba trovare all’interno di un’istruzione
condizionale; in caso contrario, probabilmente il ciclo non sarebbe stato progettato correttamente in quanto le
istruzioni successive verrebbero sistematicamente ignorate.
L’istruzione break provoca l’uscita immediata dal ciclo, senza ulteriori verifiche della condizione. Essa può
essere utilizzata per interrompere un ciclo altrimenti infinito.
Esempio:
$giorno = 1;
while (1)
{
if ($giorno > 31)
break;
echo "$giorno<br />";
$giorno++;
}
Il ciclo precedente stampa tutti i giorni da 1 a 31. Apparentemente è un ciclo infinito, in quanto la condizione
è sempre verificata, ma l’uscita dal ciclo viene imposta dall’istruzione break opportunamente condizionata.
Anche in questo caso, si osservi come in generale l’istruzione break si debba posizionare all’interno di
un’istruzione condizionale; in caso contrario, probabilmente il ciclo non sarebbe stato progettato
correttamente in quanto le istruzioni successive verrebbero sistematicamente ignorate.
Ciclo DO-WHILE
Si tratta di una variante del ciclo WHILE, in cui però la condizione di uscita dal ciclo viene valutata al
termine della prima iterazione. Questo garantisce che il blocco di istruzioni venga eseguito almeno una volta.
Sintassi:
do
{
istruzioni;
}
while (condizione);
Ciclo FOR
Si tratta di un’istruzione iterativa, in quanto ripete ciclicamente una sequenza di istruzioni.
La condizione viene valutata all’ingresso nel ciclo, e si permane nel ciclo finché (= per tutto il tempo in cui)
la condizione risulta verificata (valore di verità TRUE).
Sintassi:
for (inizializzazione; condizione; espressione di chiusura)
{
istruzioni;
}
• inizializzazione viene eseguita una sola volta, prima della prima iterazione;
• condizione viene valutata all’inizio di ogni iterazione;
• espressione di chiusura viene eseguita a ogni iterazione, dopo il blocco di istruzioni.
Tali tre blocchi sono opzionali, e possono essere tutti omessi (lasciando comunque i ; come separatori) come
nel seguente esempio che genera ciclo infinito:
for (;;)
echo "abc";
E’ sempre possibile convertire un ciclo FOR in un ciclo WHILE e viceversa. Il ciclo FOR permette di
inserire tra parentesi tonde l’inizializzazione (che nel ciclo WHILE deve precedere il ciclo stesso) e
l’istruzione che influenza la nuova valutazione della condizione.
Esempio di confronto: stampa dei primi 50 numeri interi positivi in ordine decrescente
$numero = 50;
while ($numero > 0)
{
echo $numero;
echo "<BR />";
$numero--;
}
for ($numero = 50; $numero > 0; $numero--)
{
echo $numero;
echo "<BR />";
}
Si presti attenzione al rispettivo posizionamento di:
• inizializzazione della variabile $numero ($numero = 50);
• condizione ($numero > 0);
• espressione di chiusura ($numero--).