I cicli sono un altro degli elementi fondamentali di qualsiasi linguaggio di programmazione in quanto permettono di eseguire determinate operazioni in maniera ripetitiva. Si tratta di una necessità che si presenta molto frequentemente: infatti non è raro che un'applicazione o uno script debbano elaborare quantità anche molto elevate di dati; in questa situazione, si potrà prevedere il trattamento da utilizzare per ogni singolo dato, o gruppo di dati correlati, che sarà poi ripetuto per tutte le ricorrenze di questi ultimi.
Ciclo PHP For
Si ipotizzi di voler mostrare i multipli da 1 a 10 di un numero intero, ad esempio "5". La prima soluzione disponibile è basata sull'impiego del ciclo for
:
for ($mul = 1; $mul <= 10; ++$mul) {
$ris = 5 * $mul;
echo "5 * $mul = $ris <br/>";
}
Questo costrutto, simile a quello usato in altri linguaggi, utilizza la parola chiave for
, seguita, fra parentesi, dalle istruzioni per definire il ciclo; di successivamente si racchiudono fra parentesi graffe tutte le istruzioni che devono essere eseguite ripetutamente.
Le tre istruzioni inserite fra le parentesi tonde e separate da punto e virgola vengono trattate in questo modo:
- la prima viene eseguita una sola volta, all'inizio del ciclo;
- la terza viene eseguita alla fine di ogni iterazione del ciclo;
- la seconda deve essere una condizione, e viene valutata prima di ogni iterazione del ciclo;
Quando la condizione risulta falsa, l'esecuzione del ciclo viene interrotta e il controllo passa alle istruzioni presenti dopo le parentesi graffe. Quando invece è vera, le istruzioni fra parentesi graffe vengono eseguite. Ovviamente è possibile che tale condizione risulti falsa fin dal primo test: in questo caso, le istruzioni contenute fra le parentesi graffe non saranno eseguite nemmeno una volta.
Il formato standard è quindi quello che utilizza le parentesi tonde per definire un "contatore": con la prima istruzione lo si inizializza, con la seconda lo si confronta con un valore limite oltre il quale il ciclo deve terminare, con la terza lo si incrementa dopo ogni esecuzione.
Prevenire i loop infiniti
Con il ciclo for
, così come con tutti gli altri cicli, è molto importante non creare una situazione in cui il ciclo non raggiunge mai una via d'uscita (il cosiddetto "infinite loop"): in questo caso, infatti, lo script rieseguirebbe il ciclo all'infinito. Nell'esempio proposto ciò potrebbe succedere ad esempio se sbagliassimo scrivendo il nome della variabile $mul
nell'istruzione di incremento.
Se avessimo scritto $mus++
avremmo incrementato questa variabile, che non viene utilizzata nel ciclo, dopo ciascuna delle sue esecuzioni. In tal modo $mul
sarebbe rimasta sempre uguale ad "1" e il ciclo avrebbe stampato all'infinito "5 * 1 = 5", perchè $mul
non sarebbe mai divenuto maggiore di "10".
In molte situazioni classiche della programmazione, un errore di questo genere potrebbe costringerci a forzare la chiusura del programma o addirittura a spegnere il terminale. Nel caso di PHP, questo di solito non succede, in quanto gli script basati su di esso hanno un limite di tempo per la loro esecuzione oltre il quale vengono arrestati. Tale limite è normalmente di 30 secondi ma è comunque impostabile attraverso il file php.ini
.
Il ciclo PHP While
Vediamo ora un altro tipo di ciclo, più semplice nella sua costruzione: il ciclo while
. Questo si può considerare come una sorta di if
ripetuta più volte, infatti la sua sintassi prevede che alla parola chiave while
segua, fra parentesi, la condizione da valutare e, fra parentesi graffe, il codice da rieseguire fino a quando tale condizione rimane vera. Vediamo come ottenere con while
lo stesso risultato dell'esempio precedente:
$mul = 1;
while ($mul <= 10) {
$ris = 5 * $mul;
print("5 * $mul = $ris<br>");
$mul++;
}
Il ciclo while
, rispetto al for
, non mette a disposizione le istruzioni per inizializzare e per incrementare il contatore, quindi dobbiamo inserire queste istruzioni nel flusso generale del codice, per cui mettiamo l'inizializzazione prima del ciclo e l'incremento all'interno del ciclo stesso, in fondo. Anche in questa situazione il concetto fondamentale è che l'esecuzione del ciclo termina quando la condizione fra parentesi non è più verificata. Ancora una volta è possibile che il ciclo non venga mai eseguito nel caso in cui la condizione risulti falsa fin da subito.
Il ciclo PHP do...while
Esiste un'altra forma, simile al while
, con la quale possiamo assicurarci che il codice indicato tra le parentesi graffe venga eseguito almeno una volta: si tratta del do...while
$mul = 11;
do {
$ris = 5 * $mul;
print("5 * $mul = $ris<br>");
$mul++;
} while ($mul <= 10)
Con questa sintassi, il while
viene spostato dopo il codice da ripetere, ad indicare che la valutazione della condizione viene eseguita solo dopo l'esecuzione del codice fra parentesi graffe. Nel caso dell'esempio mostrato, abbiamo inizializzato la variabile $mul
col valore "11" per creare una situazione nella quale, con i cicli visti prima, non avremmo ottenuto alcun output, mentre con l'uso del do...while
il codice viene eseguito una volta nonostante la condizione indicata fra parentesi sia falsa fin dall'inizio. L'esempio stamperà quindi "5 * 11 = 55
".