Controllo del flusso

Indice

Ogni linguaggio di programmazione necessita di strumenti per il controllo del flusso che consentano di realizzare un’evoluzione dello stato coerente con il verificarsi di determinate condizioni oppure l’esecuzione di determinate operazioni iterativamente, sfruttando le capacità di calcolo di un elaboratore. In questa lezione analizzerai le strutture di controllo condizionali, che ti permetteranno di far compiere delle azioni al programma nel caso si verifichino (o non si verifichino) determinate condizioni.

Costrutti condizionali
Le strutture di controllo che ci permettono di scegliere se eseguire o meno frammenti di codice in funzione di alcune condizioni prendono il nome di condizioni.
l'istruzione if
La più utilizzata delle strutture di controllo condizionali è senz’altro l’istruzione if, la cui sintassi più semplice è la seguente:
Copia codice

if ( $anni >= 18)
print "complimenti! Sei maggiorenne";
Come possiamo notare è composta da una parola chiave if, da un’espressione contenuta fra parentesi tonde e da un’istruzione.

L’espressione contenuta fra parentesi tonde verrà valutata in senso booleano, quindi il suo risultato sarà considerato o vero o falso.
Nel primo caso (vero), verrà eseguita l'istruzione:

Copia codice

print "complimenti! Sei maggiorenne";
// altrimenti (falso), l'istruzione verrà saltata.
Nulla toglie che le istruzioni possano essere più d’una, in questo caso la sintassi del costrutto cambia nella forma più generica:
Copia codice

if (condizione) {
//porzione di codice da eseguire se la condizione è vera
}
Nel codice seguente è visualizzato un esempio. La condizione “if” e il blocco di istruzioni non devono avere il punto e virgola.
Copia codice

if ($anni >= 18 ) {
print "complimenti! Sei maggiorenne";
}
L’istruzione “if” ci permette di definire parti di codice che saranno eseguite solo se una certa espressione assume il risultato booleano TRUE; è altresì possibile definire porzioni di codice che saranno eseguite nel caso in cui la condizione contenuta nell’espressione assuma il valore FALSE (condizione if-else)
eccone la sintassi:
Copia codice

if (condizione ) {
//codice da eseguire se la condizione è vera
} else {
//codice da eseguire se la condizione è falsa
}
Se il risultato della condizione è TRUE allora verrà eseguito il pezzo di codice che sta sotto l’istruzione “if”, altrimenti verrà eseguito il pezzo di codice che sta sotto l’istruzione “else”.

Una potenza di controllo maggiore sulle istruzioni ci viene data dal costrutto if-elseif-else, che può essere ripetuto più volte all’interno del costrutto e la cui sintassi è:

Copia codice

if (condizione_a) {
//codice da eseguire se condizione_a è vera
}
elseif (condizione_b) {
//codice da eseguire se condizione_a è falsa e condizione_b è vera
}
elseif (condizione_c) {
//codice da eseguire se condizione_a è falsa, condizione_b è falsa e condizione_c è vera
}
else {
//codice da eseguire se tutte le precedenti condizioni sono false
}
La condizione switch
La condizione switch viene utilizzata al posto del costrutto “if-elseif-else” quando bisogna effettuare controlli multipli su singole espressioni.
la sua sintassi generica è:
Copia codice

switch (espressione) {
case "primo_valore":
// codice da eseguire se (espressione = = primo_valore)
break;
case "secondo_valore":
// codice da eseguire se (espressione = = secondo_valore)
break;
case "terzo_valore":
case "quarto_valore":
// codice da eseguire se (espressione = = terzo_valore) oppure se (espressione = = quarto_valore)
break;
default:
// codice da eseguire se tutte le altre condizioni non sono verificate
}
Costrutti iterativi
I costrutti iterativi sono un altro fondamentale strumento per un qualsiasi linguaggio di programmazione, in quanto permettono di eseguire ciclicamente pezzi di codice in funzione di alcune condizioni.
Capita spesso, infatti, di dover elaborare grosse quantità di dati e che si debba prevedere il trattamento di gruppi di essi per poi ripeterlo ciclicamente su tutti i dati presenti.
In PHP esistono numerosi costrutti che ci permettono di eseguire operazioni cicliche sul codice.
ciclo for
Il ciclofor” è senz’altro uno dei costrutti comuni a molti linguaggi e consente di eseguire un certo numero noto a priori di iterazioni.
la sintassi è la seguente:
Copia codice

for (inizio_ciclo; condizione; azione) {
// codice da eseguire quando la condizione è vera
}
Il ciclo così definito viene eseguito seguendo quest’ordine:

  • “inizio_ciclo”, contenente di solito inizializzazione di oggetti;
  • valutazione della “condizione”: se questa è vera si passa al punto 3, altrimenti viene saltato tutto il codice contenuto fra parentesi graffe e si esce dal ciclo;
  • esecuzione di “azione”, contenente di solito un’operazione di incremento dell’oggetto inizializzato, e contemporaneamente esecuzione del codice racchiuso fra parentesi graffe.

Quindi il ciclo viene rieseguito partendo dalla valutazione della “condizione”.

Nel seguente codice è visualizzato un esempio pratico del ciclo “for” che genera come output la tabellina del 9 in questa forma:

Copia codice

<!DOCTYPE html>
<html lang="it">
<head>
<title>Ciclo for in PHP<title>
<meta charset="utf-8">
</head>
<body>
<p>
<?php
for($a = 1; $a <= 10; $a++) {
$ris = 9 * $a;
print(" 9 * $a = $ris <br />");
}
?>
</p>
</body>
</html>
Risultato
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
9 *10 = 90
while
Il ciclo while” è un costrutto con una sintassi molto semplice e compatta, che ci permette comunque di operare controlli di codice molto efficaci.
La sintassi generica è la seguente:
Copia codice

while (condizione) {
// codice da eseguire per ogni ciclo
// eventuale codice di modifica della condizione
}
Il costrutto “while” ha un comportamento molto simile al costrutto “for”, infatti anche in questo caso, se la condizione restituisce un valore FALSE, allora non viene eseguita nessuna ripetizione e il pezzo di codice contenuto fra parentesi graffe viene saltato.
All’interno del ciclo dovrà esistere una qualche istruzione in grado di modificare il valore della condizione, altrimenti potrebbe crearsi una iterazione infinita.

Nel codice seguente si può notare come il precedente script per realizzare l’output della tabellina del 9 viene implementato mediante l’uso del “while“.

Copia codice

<!DOCTYPE html>
<html lang="it">
<head>
<title>Ciclo while in PHP<title>
<meta charset="utf-8">
</head>
<body>
<p>
<?php
$a = 1;
while ($a <= 10) {
$ris = 9 * $a;
print(" 9 * $a = $ris <br />");
$a++;
}
?>
</p>
</body>
</html>
do-while
Sia per il costrutto “for” che per il costrutto “while” vale la regola secondo la quale, se la condizione è inizialmente falsa, allora il codice racchiuso fra parentesi graffe viene saltato e il ciclo finisce.

Il costrutto do-while“, invece, ci permette di eseguire il codice racchiuso fra parentesi graffe almeno una volta prima che si esca dal ciclo.
Questa è la sua sintassi generica:

Copia codice

do {
// codice da eseguire per ogni ciclo
} while (condizione);
Se osserviamo lo script riportato nel codice seguente possiamo notare che, nonostante la condizione risulti falsa fin dall’inizio, se proviamo a eseguire il codice, il blocco delle istruzioni che stanno fra parentesi graffe viene eseguito almeno una volta, e quindi lo script stamperà il numero 10.
Copia codice

<!DOCTYPE html>
<html lang="it">
<head>
<title>Ciclo do-while in PHP<title>
<meta charset="utf-8">
</head>
<body>
<p>
<?php
$a = 10;
do {
print($a++ . "<br />");
} while ($a < 10)
?>
</p>
</body>
</html>
ciclo foreach
Esiste una particolare struttura di controllo costruita appositamente per trattare gli array; si tratta del ciclo “foreach
la cui sintassi generica è:
Copia codice

foreach ($array as $chiave => $valore) {
// codice da eseguire per ogni elemento dell'array
}
All’interno delle parentesi graffe possiamo scrivere istruzioni che fanno riferimento all’indice e al contenuto dell’elemento che stiamo trattando.

Nel caso ci interessi solo il valore e non la chiave possiamo utilizzare il costrutto in questa forma:

Copia codice

foreach ($array as $valore) {
// codice da eseguire per ogni elemento dell'array
}