I blog di Alessioempoli

Data 15 ottobre 2017

PHP – 2

Per ingrandire il testo, cliccare sul browser

Per ingrandire le foto, cliccarci sopra

PHP – 2

 

 

# Le costanti in PHP

 

In PHP, come in altri linguaggi per la programmazione o lo sviluppo, una costante è definibile come una porzione di memoria destinata a contenere un dato caratterizzato dal fatto di essere immutabile durante l’esecuzione di uno script. Sulla base di quanto appena detto le costanti possono essere quindi considerate come l’esatto opposto di una variabile, inoltre, sempre a differenza delle variabili, le costanti divengono automaticamente globali per l’intero script nel quale vengono definite.

 

Una costante può essere definita in PHP attraverso l’impiego del costrutto define che accetta due parametri in ingresso, questi ultimi sono: il nome della costante e il valore associato ad essa in fase di digitazione del codice.

 

A livello sintattico le costanti in PHP vengono dichiarate attraverso dei nomi che iniziano con una lettera o con l’underscore, per esse non è quindi previsto l’impiego del carattere iniziale $ come avviene invece per le variabili. Per convenzione i nomi delle costanti vengono scritti interamente in maiuscolo.

 

Il valore contenuto da una costante può essere soltanto di tipo scalare o null. I tipi di dato scalare sono: interi, float, stringhe e booleani. Nella release 7 di PHP, non ancora rilasciata in versione definitiva nel momento in cui scrivo, si potranno utilizzare anche gli array. Vedi le novità principali di PHP 7.

 

Analizziamo ora alcuni esempi pratici di definizione delle costanti:

 

1-86k

 

Per recuperare tutte le costanti utilizzate all’interno dell’esecuzione di uno script si ha la possibilità di utilizzare invece la funzione denominata get_defined_constants () tramite una sintassi come quella proposta nell’esempio seguente:

var_dump(get_defined_constants(true));

 

 

Le costanti predefinite

 

Il linguaggio PHP, oltre a consentire la definizione di nuove costanti durante la digitazione dei sorgenti, contiene anche alcune costanti predefinite che potrebbero rivelarsi utili in circostanze specifiche:

 

2-78k

 

Le espressioni in PHP

 

In informatica un’espressione può essere considerata come la combinazione di uno o più valori con operatori e funzioni. Tale combinazione produce un valore come risultato. Si può applicare la definizione matematica di espressione anche nei linguaggi di programmazione.

In PHP può essere definita espressione un qualsiasi costrutto che restituisce un valore. Vediamo a tal proposito alcuni esempi:

 

3-72k

 

Il valore di una qualsiasi espressione può essere assegnato ad una variabile. Nel caso proposto di seguito il valore della variabile è dato dal risultato dell’espressione che si trova a destra dell’operatore di assegnazione (=):

$a = 3 + 3; //il valore di $a è il risultato dell’espressione: $a = 6

 

Questa sintassi consente di avere più espressioni all’interno di una singola istruzione. Prendiamo come esempio un costrutto echo che viene utilizzato per stampare a schermo un valore passato come parametro (es. echo 2;). Possiamo anche passare al costrutto il risultato di un’espressione definita all’interno della stessa istruzione, in questo modo:

echo 1 + 2;

 

L’esempio appena presentato stamperà a schermo il valore 3: questo poiché tendenzialmente le espressioni vengono valutate da destra verso sinistra. In questo caso quindi viene prima eseguita l’espressione 1 + 2 e poi passato il risultato al costrutto echo.

Tale regola, però, non è sempre vera. Vedremo infatti più avanti, che le funzioni e gli operatori possono definire priorità differenti.

Alla luce della regola appena definita, analizziamo alcuni esempi della applicazione pratica:

 

4-90k

 

L’operatore di incremento ++ aumenta unitariamente il valore della variabile a cui è applicato. Al termine della valutazione, quindi, verrà stampato a schermo il valore 2. L’operatore può essere applicato prima (pre-incremento) o dopo (post-incremento) rispetto alla variabile di riferimento. A seconda della posizione cambia la priorità e, di conseguenza, il risultato dell’operazione.

Nel caso appena descritto l’operatore viene applicato prima dell’esecuzione del costrutto e, quindi la variabile $i verrà incrementata di un’unità prima di essere stampata. Nel caso in cui l’operatore venga posizionato dopo la variabile, il suo incremento verrà posticipato al termine della valutazione dell’espressione.

echo $i++;

 

In quest’ultimo esempio verrà stampato a schermo il valore 0 e, successivamente, incrementato il valore della variabile. Approfondiremo questo operatore  quando parleremo degli operatori matematici.

 

 

# Operatori aritmetici di PHP

 

Nella lezione relativa alle espressioni abbiamo introdotto l’operatore di incremento ++ che aumenta di un’unità il valore della variabile a cui viene associato. Questo operatore è soltanto uno tra quelli messi a disposizione da PHP per effettuare operazioni aritmetiche. Vediamo insieme nel dettaglio quali sono gli altri e qual’è il loro funzionamento.

Iniziamo ovviamente dai più semplici, quelli più intuitivi che sicuramente già conosciamo:

 

5-77k

 

In questo caso la condizione stamperà a schermo 5 è dispari dato che il resto dell’operazione è 1 e non 0. La condizione appena proposta all’interno dell’ if è un operatore booleano che tratteremo approfonditamente più avanti. Per ora utilizziamo invece l’esempio anche per introdurre un’altra regola di priorità: le parentesi (). Queste ultime modificano la priorità delle operazioni in un’espressione proprio come accade nella matematica, valutando prima il valore in esse contenuto e poi il resto dell’espressione. Nel nostro caso viene prima valutato il valore del modulo e poi eseguito il resto dell’espressione.

Tornando agli operatori aritmetici introdotti in questa lezione, essi possono essere utilizzati non solo tra valori scalari ma anche con variabili e funzioni, come già mostrato nella lezione delle espressioni:

 

$a = 1 + 1;

$b = 4 – 2;

$b = $b + $a; // 2 + 2 = 4

 

Nell’esempio appena visto possiamo notare la situazione in cui il risultato di un’espressione viene assegnato come risultato alla variabile stessa. La variabile $b, quindi, viene modificata sommando il suo valore iniziale al valore di $a. La stessa espressione può essere riscritta utilizzando gli operatori di assegnazione combinati:

$b += $a; // equivale a $b = $b + $a

 

Tali operatori possono essere utilizzati con tutte le operazioni aritmetiche finora descritte:

 

6-65k

 

La differenza della posizione dell’operatore determina la priorità con cui viene eseguito l’incremento o il decremento. Se si trova a sinistra viene eseguita prima di valutare il resto dell’espressione; se si trova a destra viene eseguita dopo aver valutato l’espressione. Vediamo alcuni esempi a riguardo:

 

7-74k

 

I due costrutti condizionali appena visti sembrano del tutto identici, il risultato però è diverso in base alla posizione dell’operatore di incremento. Nel primo caso la variabile viene incrementata prima di verificare che essa sia uguale a 6, quindi verrà eseguito il codice nel primo ramo della if, quello corrispondente alla condizione vera. Nel secondo caso, invece, la variabile viene incrementata al termine dell’espressione quindi verrà valutato 5 == 6 che è falso e quindi verrà eseguito il codice nel ramo dell’else.

 

# Operatori logici e di confronto in PHP

 

Gli operatori logici e di confronto sono gli ultimi gruppi di operatori del PHP che verranno analizzati e che possono essere utilizzati all’interno delle espressioni.

 

Operatori logici

Gli operatori logici consentono di determinare se la relazione tra due o più espressioni è vera (TRUE) o falsa (FALSE). L’unico operatore che fa eccezione a questa regola è l’operatore not che si occupa di negare il valore di un’espressione. Vediamo insieme quali sono gli operatori logici supportati dal PHP associando ad essi alcuni esempi del loro funzionamento:

 

8-81k

 

Come analizzato precedentemente, PHP, a differenza ad esempio del C, supporta il tipo di dato booleano, quindi il risultato di un’espressione tra operatori logici sarà a sua volta un booleano.

 

9-81k

 

Nel caso in cui un’espressione sia un array, invece, essa viene valutata come vera se e soltanto se l’array non è vuoto, altrimenti è falsa:

array() && true;  //false

array(1, 2, 3) && true;  //true

 

 

Operatori di confronto

Gli operatori di confronto consentono di determinare il valore di due espressioni in base al confronto tra i loro valori.

 

10-98k

Alcuni esempi relativi a tali risultati potrebbero essere i seguenti:

 

11-57k

 

I confronti possono essere effettuati anche con altri tipi di dato che non siano numerici, come ad esempio le stringhe. Nel caso delle stringhe il confronto viene fatto in base all’ordine alfabetico dei caratteri seguendo l’ordine:

 

– caratteri maiuscoli;

– caratteri minuscoli:

– cifre.

Motivo per il quale si avrà:

 

12-54k

 

 

# If, else, istruzioni condizionali in PHP

 

In precedenza è stato possibile analizzare alcuni frammenti di codice in cui venivano eseguite operazioni in base a determinate condizioni. Questo è possibile grazie alle istruzioni condizionali che ci consentono di avere comportamenti differenti all’interno del nostro codice in base a specifiche condizioni.

 

if

L’istruzione if è forse la più rappresentativa tra le strutture di controllo del flusso: ci permette di eseguire o non eseguire certe porzioni di codice. Esaminiamone la sintassi più elementare:

if( <condizione> ) <istruzione>

 

Dopo la keywork if, deve essere indicata fra parentesi un’espressione da valutare (condizione). Questa espressione sarà valutata in senso booleano, cioè il suo valore sarà considerato vero o falso.

Dunque, se la condizione è vera, l’istruzione successiva verrà eseguita, altrimenti sarà ignorata.

Spesso, al verificarsi della condizione, abbiamo la necessità di eseguire non una sola ma più istruzioni. Questo è perfettamente possibile, ricordandoci che possiamo utilizzare i blocchi di istruzioni compresi fra parentesi graffe.

 

13-60k

 

Se la variabile $nome ha effettivamente il valore “Luca”, le istruzioni successive, comprese tra parentesi graffe, saranno eseguite. Dopo avere valutato la condizione ed eventualmente eseguito le istruzioni previste, lo script proseguirà con ciò che sta fuori dalle parentesi graffe. Quindi verrà mostrato il numero di messaggi relativi all’utente corrente. Nel nostro caso corrisponderà  a “5”, dato che la variabile $messaggi è stata modificata all’interno delle parentesi graffe.

Se l’istruzione da eseguire nel caso in cui la condizione sia vera è una sola, le parentesi graffe sono opzionali.

 

14-57k

 

I due costrutti appena proposti si equivalgono nel risultato.

 

NOTA: E’ buona norma usare comunque le parentesi graffe per delimitare il codice condizionato, anche quando esso è costituito da una sola istruzione: infatti questo accorgimento sintattico rende il codice più leggibile, ed inoltre potrebbe limitare gli errori se dovesse capitare di voler aggiungere delle istruzioni al blocco dimenticando di aggiungere le graffe.

 

Condizioni booleane

 

Se l’espressione da valutare non dovesse restituire un valore booleano, PHP convertirà comunque questo valore in booleano utilizzando alcune precise regole. Esaminiamo un altro semplice esempio:

 

15-35k

 

Questo codice, da un punto di vista logico, non ha nessun senso, ma ci permette di capire come PHP interpreta le nostre espressioni. Infatti in questo caso la stringa “Ciao Luca!” verrà stampata comunque. Questo perché in PHP il valore “5”, così come qualsiasi numero diverso da “0”, è considerato vero (TRUE).

 

In sostanza, PHP considera come falsi:

 

– il valore numerico “02, nonché una stringa che contiene ‘0’;

una stringa vuota;

– un array con zero elementi;

– un valore NULL, cioè una variabile che non è stata definita o che è stata eliminata con unset (), oppure a cui è stato assegnato il valore NULL esplicitamente.

 

Qualsiasi altro valore è per PHP un valore vero. Quindi qualsiasi numero, intero o decimale purché diverso da “0”, qualsiasi stringa non vuota, se usati come espressione condizionale saranno considerati veri.

 

 

Operatori di uguaglianza (==) e assegnamento (=)

 

Analizziamo ora un caso che spesso crea dei problemi in fase di sviluppo se non viene compreso fin dalle prime battute. Prendiamo questo codice come esempio:

 

$a = 7;

if ($a = 4) echo ‘$a è uguale a 4!';

 

A prima vista possiamo lasciarci ingannare da queste istruzioni, soprattutto se abbiamo esperienza con linguaggi di programmazione in cui un’espressione come $a = 4 potrebbe essere sia un’assegnazione che un test. Se pensiamo che che questo blocco di codice non stampi niente, rimarremo sorpresi di vedere invece sul browser la frase ‘$a è uguale a 4’.

 

€™espressione che abbiamo messo fra parentesi è un’assegnazione: cioè essa assegna alla variabile $a il valore “4”. L’istruzione seguente viene quindi eseguita per il motivo che abbiamo visto prima: il valore della nostra espressione è 4, che per PHP equivale a un vero booleano. Se invece di if ($a = 4) avessimo scritto if ($a = 0) l’istruzione seguente sarebbe stata saltata, perché la nostra condizione avrebbe preso valore “0”, cioè falso.

 

Per ottenere il risultato corretto logicamente, avremmo dovuto utilizzare l’operatore di confronto (==):

$a = 7;

if ($a == 4) echo ‘$a è uguale a 4!';

 

Ricordiamoci quindi di utilizzare l’operatore condizionale di uguaglianza, il doppio uguale (==) per le comparazioni.

 

else

Negli esempi di codice visti finora avremo sicuramente notato che vengono effettuate operazioni solo nel caso in cui una condizione sia vera. Non eseguiamo invece nulla nel caso in cui questa risulti falsa. Per eseguire istruzioni se la condizione è falsa abbiamo bisogno del costrutto else.

 

16-49k

 

La parola chiave else, che significa “altrimenti”, deve essere posizionata subito dopo la parentesi graffa di chiusura del codice previsto per il caso “vero” (o dopo l’unica istruzione prevista, se non abbiamo usato le graffe). Anche per else valgono le stesse regole: niente punto e virgola, parentesi graffe obbligatorie se dobbiamo esprimere più di un’istruzione, altrimenti facoltative. Ovviamente il blocco di codice specificato per else verrà ignorato quando la condizione è vera, mentre verrà eseguito se la condizione è falsa.

Le istruzioni if possono essere nidificate una dentro l’altra, consentendoci così di creare codice di una certa complessità:

 

17-50k

 

In questo caso, abbiamo nidificato un ulteriore test all’interno del primo caso, quello in cui $nome ha il valore “Luca”. Abbiamo infatti previsto un messaggio diverso, a seconda del valore della variabile $cognome.

 

elseif

Un’ulteriore possibilità che ci fornisce l’istruzione if in PHP è quella di utilizzare la parola chiave elseif. Attraverso quest’ultima possiamo indicare una seconda condizione, da valutare solo nel caso in cui quella precedente risulti falsa. Indicheremo quindi, di seguito, il codice da eseguire nel caso in cui questa condizione sia vera, ed eventualmente, con else, il codice previsto per il caso in cui anche la seconda condizione sia falsa.

 

18-58k

 

In questo caso, abbiamo un’istruzione da eseguire quando $nome vale “Luca” nel caso in cui ciò non sia vero, è prevista una seconda istruzione se $cognome è “Verdi”; se nemmeno questo è vero, allora verrà eseguita la terza istruzione.

Da notare che, se $nome è “Luca” e $cognome è “Verdi”, viene comunque eseguita solo la prima istruzione, perché dopo avere verificato la condizione, tutti gli altri casi vengono ignorati.

 

 

# Istruzione Switch e operatore ternario

 

In precedenza sono state introdotte le istruzioni condizionali che, attraverso le keywords if, else e endif, consentono di effettuare operazioni in base al valore di una variabile o di un’istruzione. Adesso , invece, verrà un’altro costrutto condizionale, lo switch che permette di racchiudere in un unico blocco di codice diverse istruzioni condizionali.

 

if/elseif/else Vs. switch

Si analizzi un esempio di istruzione condizionale basata sull’utilizzo combinato di if, elseif ed else nel medesimo blocco di codice:

 

19-91k

 

In pratica, il codice proposto in precedenza verifica il valore di una variabile che corrisponde ad un colore definito dall’utente. Se tale colore è uno tra “blu”, “giallo”, “verde”, “rosso” (il valore corretto nel caso dell’esempio) o “arancione”, allora il sistema stamperà l’output previsto per la conferma, altrimenti verrà mostrato un messaggio di errore introdotto tramite else.

Lo stesso codice potrà essere riscritto, in una maniera più leggibile e semplice da gestire, attraverso il costrutto switch:

 

20-76k

 

Come è possibile notare, il costrutto switch contiene tra parentesi l’espressione da verificare e al suo interno una serie di case che rappresentano i possibili valori da valutare. Al termine di ogni case, inoltre, viene inserita la keyword break che ci farà uscire l’esecuzione dell’istruzione dallo switch. Tale keyword è importante perché, senza di essa, verrebbero valutati anche gli altri case contenuti nello switch, incluso il default che è quello valutato quando nessuno degli altri case soddisfa la condizione.

 

switch e sequenze di case

I case possono anche essere sequenziali quindi, nel caso in cui diversi valori contengono lo stesso codice da eseguire, potranno essere inseriti in sequenza:

 

21-64k

 

Nell’esempio presentato lo switch esegue la stessa istruzione in casi differenti. Quindi, se il colore è “blu” o “verde”, allora visualizzeremo il messaggio relativo ai colori freddi, se il colore è “giallo”, “rosso” o “arancione” verrà visualizzato il messaggio relativo ai coloro caldi. Se invece il colore non viene identificato da nessuno dei casi, verrà mostrato un messaggio di errore.

 

Introduzione all’operatore ternario

 

L’operatore ternario rappresenta un’altra alternativa sintattica al costrutto if/else, esso è così chiamato perché è formato da tre espressioni: il valore restituito è quello della seconda o della terza di queste espressioni, a seconda che la prima sia vera o falsa. In pratica, si può considerare, in certi casi, una maniera molto sintetica di effettuare un costrutto condizionale basato su if.

($altezza >= 180) ? ‘alto’ : ‘normale';

 

Questa espressione prenderà il valore “alto” se la variabile $altezza è maggiore o uguale a “180”, “normale” nel caso opposto. L’espressione condizionale è contenuta fra parentesi e seguita da un punto interrogativo, mentre due punti separano la seconda espressione dalla terza. Questo costrutto può essere utilizzato, ad esempio, per valorizzare velocemente una variabile senza ricorrere all’if. In pratica:

$tipologia = ($altezza >= 180) ? ‘alto’ : ‘normale';

 

equivale a scrivere:

 

22-52k

 

Come è possibile notare, in termini di complessità il risparmio è abbastanza significativo. Bisognerà però stare attenti a non abusare di questo operatore, perché esso potrebbe rendere più difficoltosa la leggibilità di uno script, anche se risulta di indubbia utilità nel caso in cui si necessiti rendere più compatto il codice.

 

 

# Approfondimenti sull’operatore ternario

 

I costrutti condizionali basati sui blocchi if e else permettono di eseguire del codice in base a determinate condizioni. Come accennato nel precedente capitolo esiste però un operatore che consente di rappresentare un costrutto condizionale in una maniera alternativa e molto più snella dal punto di vista del codice digitato. Stiamo parlando dell’operatore ternario.

 

Quest’ultimo rappresenta una valida alternativa sintattica alle espressioni if/else nel caso in cui sia necessario valutare espressioni semplici. Tale operatore è così chiamata poiché prevede l’adozione di 3 diversi argomenti, cioè nell’ordine:

 

– l’espressione da valutare;

– il valore di ritorno nel caso in cui l’espressione sia vera;

– il valore di ritorno nel caso in cui l’espressione sia falsa.

A tal proposito è possibile analizzare il semplice esempio seguente:

$maggiorenne = ($eta >= 18) ? true : false;

 

Il codice proposto mostra come utilizzare l’operatore ternario. Il primo argomento ($eta >= 18) è l’espressione da valutare, seguito da un punto interrogativo ? e i due argomenti in caso di espressione vera o falsa separati da due punti :.

 

Come sottolineato in precedenza, l’operatore ternario rappresenta un’alternativa al costrutto if/else; a riprova di ciò un esempio equivalente a quello precedente sarebbe stato espresso tramite questi ultimi in questo modo:

 

23-51k

 

Operatore ternario abbreviato

Si analizzi un ulteriore esempio di utilizzo dell’operatore ternario per la valutazione di una condizione:

$messaggio = “Ciao ” . ( $username ? $username : ‘utente’ );

 

Nell’esempio appena presentato la variabile $messaggio conterrà il valore relativo alla “username” dell’utente soltanto nel caso in cui la variabile associata ad essa ($username) sia stata effettivamente definita, in caso contrario verrà utilizzata la stringa utente.

 

Se il valore da restituire nel caso in cui l’espressione sia vera dovesse corrispondere esattamente all’espressione valutata, allora potrà essere omesso il secondo parametro unendo il punto interrogativo con i due punti, ?:, ottenendo così quello che viene chiamato l’operatore ternario abbreviato. Sulla base di quanto detto è possibile riscrivere l’esempio precedente in questo modo:

$messaggio = “Ciao ” . ( $username ?: ‘utente’ );

 

 

Operatori ternari concatenati

 

Dato che la valutazione di un operatore ternario restituisce un valore, è anche possibile concatenare operatori ternari tra di loro.

$patente = ($eta >= 18) ? ($esame_superato ? true : false) : false;

 

Nell’ultimo esempio proposto abbiamo due operatori ternari: il primo verifica che il valore associato alla variabile $età sia maggiore o uguale a “18”, il secondo viene invece valutato soltanto se la prima condizione risulta vera, verificando che l’esame sia stato superato. La variabile $patente sarà quindi vera se e solo se si verificano entrambe le condizioni, altrimenti sarà falsa.

Per quanto ci venga concessa la possibilità di concatenare gli operatori ternari, però, è sconsigliabile l’utilizzo in questa maniera dato che riduce di molto la leggibilità del codice.

 

 

# I cicli: for, while e do

 

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 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:

 

24-43k

 

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 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:

 

25-48k

 

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

 

26-50k

 

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

 

 

# Ciclo foreach in PHP

 

Abbiamo già visto  come attraverso i costrutti for e while sia possibile eseguire dei cicli finché una determinata condizione è vera. Nel paragrafo  relativo ai tipi di dato, invece, abbiamo introdotto il tipo array. Come già definito, un array può essere considerato una matrice matematica ad una o più dimensioni.

 

27-52k

 

Nel caso volessimo effettuare delle operazioni per ogni elemento del nostro array, potremmo eseguire un ciclo for o while verificando che l’indice (cioè la posizione all’interno dell’array) sia minore alla dimensione dell’array. È una soluzione però alquanto scomoda e poco performante.

Esiste in PHP un ulteriore costrutto, il foreach, con cui è possibile ciclare anche gli array senza effettuare controlli sulla loro dimensione. PHP si occuperà automaticamente di terminare il ciclo quando tutti gli elementi sono stati processati. Analizziamo un esempio che calcola la somma degli elementi di un array:

 

28-50k

 

Il costrutto dopo la parola chiave foreach include all’interno delle parentesi tonde tre elementi:

 

– l’array da ciclare

– la parola chiave as

– la variabile che contiene il valore dell’indice corrente

 

Come i cicli finora descritti, anche il foreach conterrà il codice da eseguire ad ogni iterazione all’interno delle parentesi graffe.

 

Foreach e array multidimensionali

Abbiamo visto come sia facile ciclare gli elementi di un array ad una sola dimensione. Ma un array può prevedere anche più dimensioni. Vediamo quindi come ciclare un array multidimensionale:

 

29-63k

 

Nell’esempio precedente stampiamo per ogni utente il nome e l’età di ognuno e, contestualmente, sommiamo le età di tutti. Il foreach ha una sintassi identica a quella dell’esempio precedente con la differenza che, in caso di array a più dimensioni, si utilizzano due variabili: la variabile che identifica l’indice dell’array (nel nostro caso il nome dell’utente) e la variabile che identifica il valore dell’indice (nel nostro caso l’età).

 

Modificare gli elementi di un array attraverso il foreach

Riprendendo l’esempio appena proposto e supponendo di voler modificare i valori dell’array aggiungendo un anno alle età di tutti gli utenti, la soluzione che sicuramente ci viene in mente è quella di utilizzare il foreach e sommare “1” ad ogni iterazione.

 

30-57k

 

La funzione print_r ci consente di stampare a schermo il contenuto di un array.

 

Se proviamo ad eseguire il seguente codice, noteremo che i valori resteranno intatti e l’incremento non viene in realtà applicato. Questo accade perché il PHP generalmente crea una copia in memoria dell’array e lavora su di essa, anziché lavorare sullo spazio di memoria allocato dall’array originale. Nel caso in cui volessimo agire, invece, sull’array originale abbiamo la necessità di passare i valori per riferimento.

Approfondiremo nella sezione dedicata alle funzioni il significato della gestione delle variabili per riferimento e non per valore. Per ora è sufficiente sapere che è una modalità che ci consente di scrivere sull’array originale e di non perdere le modifiche effettuate. Per raggiungere questo scopo è necessario aggiungere la keyword & prima del nome della variabile (nel nostro caso $eta) ed automaticamente il codice precedente ci restituirà il risultato atteso:

 

31-80k

 

 

# Controllare i cicli con break e continue

 

abbiamo introdotto i cicli ed abbiamo visto come eseguirli finché una certa espressione è vera (for, while, do…while) oppure finché non terminano gli elementi contenuti in un array (foreach).

Quello che però non abbiamo detto finora è che ci sono due costrutti che consentono di interrompere un ciclo oppure di saltare il resto del ciclo corrente e riprendere l’esecuzione dalla verifica della condizione di controllo dall’inizio dell’iterazione successiva.

Stiamo parlando delle strutture di controllo break e continue.

 

Break

Il costrutto break consente di interrompere un ciclo e di uscirne senza continuare le iterazioni rimanenti. È molto utile, ad esempio, quando si cerca un valore all’interno di un array: nel momento in cui l’elemento viene trovato non è necessario continuare con altri gli elementi. Vediamo un esempio:

 

32-52k

 

Nell’esempio appena proposto vogliamo visualizzare la posizione di arrivo dell’atleta Josephine. Quello che facciamo è utilizzare il costrutto foreach per ciclare su tutti gli atleti e verifichiamo per ognuno di essi il nome.

Non appena troviamo l’utente che stiamo cercando non è più necessario continuare le iterazioni per i restanti atleti ma possiamo interrompere l’esecuzione del ciclo. Per raggiungere il nostro scopo è sufficiente utilizzare la struttura di controllo break.

Il costrutto break è utile però anche in un’altra circostanza che abbiamo analizzato in precedenza, quella relativa alla utilizzo del costrutto condizionale switch. In questo caso, infatti, è utilizzato per uscire dal costrutto nel momento in cui uno dei casi corrisponde al valore che stiamo verificando in quel momento. Vediamo anche in questo caso un esempio:

 

33-68k

 

Una volta che abbiamo trovato il valore corrispondente alla posizione di arrivo dell’atleta non è necessario valutare ulteriori casi dello switch e possiamo uscire dal costrutto.

 

Continue

La struttura di controllo continue è utilizzata per saltare il ciclo corrente e proseguire con le iterazioni successive previste. Vediamo un esempio per capire un po’ più a fondo di cosa stiamo parlando:

 

34-43k

 

Nell’esempio precedente vogliamo stampare a schermo soltanto i numeri pari contenuti all’interno del ciclo for. Abbiamo visto in una lezione precedente come utilizzare l’operatore aritmetico modulo per determinare il resto di una divisione.

Nel nostro esempio, quindi, nel caso in cui un valore del ciclo non è divisibile per 2, saltiamo l’iterazione e passiamo direttamente a quella successiva.

3 Risposte a “PHP – 2”

  1. 홀덤 scrive:

    Attractive portion of content. I just stumbled upon your site and in accession capital to claim that
    I get actually loved account your weblog posts. Any way I will be
    subscribing for your feeds or even I success you get entry
    to consistently rapidly.

  2. Perricone scrive:

    Informazione preziosa. Per fortuna ho scoperto il tuo sito web per caso, e sono scioccato dal fatto che questa svolta del destino non sia avvenuta prima!Ho messo un segnalibro.

Lascia una risposta