Alla fine della precedente abbiamo visto che PHP necessita di una coppia di tag per l'apertura e la chiusura del codice contenuto in un file richiesto da un Web Server. Si tratta dei tag
<?php
.....
?>
Abbiamo però la possibilità di usare anche alcune sintassi alternative, che sono comunque sconsigliate per permettere una corretta distribuzione e portabilità dei propri progetti. In primo luogo, in script scritti in versioni precedenti di PHP, potremmo trovare il classico tag <script> con specificato esplicitamente il linguaggio PHP:
<script language="php">
.......
</script>
Un'altra possibilità è quella di usare i tag brevi, che devono essere abilitati manualmente modificando le impostazioni del file di configurazione php.ini:
<?
....
?>
Ricordiamoci tuttavia che in PHP 5 la configurazione standard disabilita i tag brevi. Un'ultima possibilità è quella di usare i tag in "stile ASP":
<%
....
%>
Anche questi però devono essere abilitati in php.ini e sono praticamente inutilizzati dalla maggior parte dei programmatori. Tutta questa varietà di sintassi è causata dalla volontà degli sviluppatori di mantenere la retrocompatibilità con le vecchie versioni che, a causa di scelte differenti di design, permettevano l'utilizzo di tag alternativi. È bene ricordare che rimane buona pratica utilizzare i tag completi evitando se possibile i tag brevi ed escludendo le altre possibilità.
Per chi non ci avesse fatto caso, puntualizzo un concetto molto importante: i tag delimitano il codice PHP, ed il codice contenuto al loro interno non sarà inviato al browser, ma compilato e eseguito. Da questo potremmo dedurre che tutto ciò che sta fuori da questi tag non verrà toccato da PHP, che si limiterà a passarlo al browser così com'è, eventualmente ripetendolo in base a situazioni particolari che vederemo in seguito. In linea di massima è bene ricordare che scrivere:
<?php
echo "<strong>";
?>
prova</strong>
e:
<strong>prova</strong>
(o qualsiasi altra combinazione) restituisce lo stesso risultato.
I commenti
Un altro argomento molto importante legato alla sintassi di PHP sono i commenti. Chi ha esperienza, anche minima, di programmazione, sa bene che molte volte i commenti si rivelano di importanza decisiva quando si tratta di mettere le mani su un programma realizzato da qualcun altro, e anche quando il programma è stato scritto da noi stessi, soprattutto se è passato qualche tempo dalla realizzazione. I commenti svolgono un ruolo fondamentale in questa fase di "rivisitazione" del codice, in quanto possono facilitare di molto la comprensione di passaggi apparentemente oscuri.
È bene quindi non risparmiare mai un commento quando possibile (senza comunque esagerare altrimenti, al posto di chiarire il codice lo renderete ancora più illeggibile), anche perchè il loro utilizzo non appesantisce l'esecuzione dello script (l'interprete PHP salta tutte le parti che riconosce come commenti), nè il trasferimento della pagina al browser (infatti i commenti, essendo contenuti all'interno del codice PHP, fanno parte di ciò che non viene inviato al browser).
Abbiamo tre diverse possibilità per posizionare i commenti all'interno del nostro codice: la prima è l'uso dei commenti in stile C++, caratterizzati da due barre:
<?php
// Commento in stile C++
?>
La seconda sono i commenti in stile Perl e Python, contraddistinti dall'uso del cancelletto (anche se ormai obsoleti e poco utilizzati):
<?php
# Commento in stile Perl
# e python
?>
Entrambi questi tipi di commenti sono limitati ad una sola riga: l'interprete PHP, quando trova le barre o il cancelletto, salta tutto ciò che si trova da quel punto fino al termine della riga. Questo ci permette di porre il commento anche sulla stessa riga del codice commentato, così:
<?php
echo 'Buongiorno a tutti <br />';
//stampo un messaggio di saluto
print 'Esclusi quelli antipatici';
# faccio una precisazione
// Questa riga contiene solo commento
?>
L'ultimo tipo di commento che abbiamo a disposizione permette di specificare commenti multilinea senza dover ripetere i caratteri ogni nuova riga grazie ad una coppia di caratteri utilizzati per l'apertura e la chiusura. Tutto il codice che segue /* viene considerato commento da PHP finchè non incontra la serie di caratteri */. Un semplice esempio:
<?php
/*
Questo è un commento
multiriga specificando
utilizzando la stessa sintassi
usata in Java e C
*/
echo /* commento */ "Ciao a tutti" /* i commenti vengono saltati*/;
?>
Riguardo i commenti multilinea, è importante ricordare che non possono essere innestati e che comunque rappresentano un separatore per l'interprete PHP. Per questo motivo le seguenti sintassi sono errate:
<?php
/*
Commento /*
multilinea
*/
Qui verrà generato un errore ...
*/
ec/* questa sintassi è errata */ho "prova";
?>
La scelta di quale tipo di commento utilizzare è solitamente soggettiva, anche se spesso vengono utilizzati i commenti multiriga per documentare il codice e quelli a riga singola per aggiungergli dei semplici appunti sul funzionamento logico.
Le variabili
Le variabili sono componenti fondamentali di qualsiasi linguaggio di programmazione, in quanto ci consentono di trattare i dati del nostro programma senza sapere a priori quale sarà il loro valore. Possiamo immaginare una variabile come una specie di contenitore all'interno del quale viene conservato il valore che ci interessa, e che può cambiare di volta in volta.
In PHP possiamo scegliere il nome delle variabili usando lettere, numeri ed il trattino di sottolineatura, o underscore (_). Il primo carattere del nome deve essere però una lettera o un underscore (non un numero).
Dobbiamo inoltre ricordare che il nome delle variabili è sensibile all'uso delle maiuscole e delle minuscole: di conseguenza, se scriviamo due volte un nome di variabile usando le maiuscole in maniera differente, per PHP si tratterà di due variabili distinte!
In PHP il nome delle variabili è preceduto dal simbolo del dollaro ($). PHP ha una caratteristica che lo rende molto più flessibile rispetto ad altri linguaggi di programmazione: non richiede, infatti, che le variabili vengano dichiarate prima del loro uso. Possiamo quindi permetterci di riferirci ad una variabile direttamente con la sua valorizzazione:
<?php
$a = 5;
?>
Con questa riga di codice definiamo la variabile a, assegnandole il valore 5. In fondo all'istruzione abbiamo il punto e virgola, che, come già accennato in precedenza, deve chiudere tutte le istruzioni PHP. L'utilità di una variabile diventa fondamentale nel momento in cui è possibile utilizzarla all'interno di espressioni matematiche o logiche. Vediamo un semplice esempio:
<?php
$a = 9;
$b = 4;
$c = $a * $b;
echo "Il risultato dell'operazione (9 * 4) è :";
echo $c;
?>
In questo brano di codice abbiamo valorizzato tre variabili: a, alla quale stavolta abbiamo dato il valore 9; b, a cui abbiamo assegnato il valore 4 e c, che dovrà assumere il valore del prodotto di a e b. Infine abbiamo stampato il risultato ottenuto. Evidentemente, dopo l'esecuzione del codice c varrà 36.
Negli esempi abbiamo visto l'inizializzazione delle variabili, termine che sta ad indicare la prima volta in cui assegniamo un valore ad una variabile. In realtà, possiamo riferirci ad una variabile anche senza che sia stata inizializzata, anche se questa risulta un'operazione sconsigliata e potrebbe generare errori durante l'esecuzione in base ad alcune direttive di configurazione di PHP che vedremo più avanti. Ad esempio, supponendo che nel nostro script non sia stata valorizzata nessuna variabile z, potremmo avere un'istruzione di questo genere:
<?php
echo $z;
?>
Questo codice non produrrà alcun output, in quanto la variabile z non esiste. Gli errori generati quando si cerca di utilizzare in lettura una variabile non inizializzata sono di tipo E_NOTICE: sono gli errori di livello più basso, cioè meno gravi, che normalmente non vengono mostrati da PHP, ma che possiamo abilitare attraverso il file di configurazione php.ini. Un errore di questo genere in effetti non compromette il buon funzionamento dello script, che infatti viene eseguito regolarmente; però potrebbe essere ugualmente indice di un qualche errore commesso da chi ha scritto il codice. Facciamo un esempio per chiarire meglio quanto esposto:
<?php
$a = 74;
$b = 29;
$risultato = $a + $b;
echo $risulato;
?>
Questo codice vorrebbe assegnare i valori 74 e 29 a due variabili, poi sommarli e infine stampare il risultato. Però contiene un errore: nell'istruzione di stampa abbiamo indicato la variabile risulato invece che risultato. Chi ha scritto il codice si aspetterebbe di vedere comparire sul browser il risultato 103, invece non troverà proprio nulla, perchè la variabile risulato non è definita, e quindi non ha nessun valore.
Si può perdere anche molto tempo alla ricerca del problema (in realtà questo sembra un problema banalissimo, ed in effetti lo è; però ricordiamoci che un caso del genere potrebbe presentarsi in un contesto molto più complesso, ed inoltre molto spesso un errore semplice come questo si dimostra molto più difficile da scovare per chi lo ha commesso). Qui però la segnalazione di errore di PHP può venirci in aiuto: infatti, se siamo abituati ad utilizzare le variabili nella maniera più corretta, cioè dopo averle inizializzate, un errore come questo ci indica chiaramente che abbiamo sbagliato a scrivere il nome. Per questo il nostro consiglio è quello di tenere abilitata la visualizzazione degli errori anche di tipo E_NOTICE, e di utilizzare le variabili solo se inizializzate o dopo aver controllato la loro esistenza.
In questo modo impareremo da subito a programmare in maniera più corretta e, anche se impiegheremo qualche minuto in più per cominciare, risparmieremo tante ore (e tanto fegato) per il futuro...
Concludiamo questa lezione sulle variabili con un accenno alle variabili dinamiche, pratica tuttora sconsigliata ma che potrebbe capitarvi di incontrare in contesti relativi a script di vecchia fattura; in qualche situazione può presentarsi la necessità di utilizzare delle variabili senza sapere a priori il loro nome. In questi casi, il nome di queste variabili sarà contenuto in ulteriori variabili. Facciamo un esempio: col codice seguente stamperemo a video il contenuto delle variabili pippo, pluto e paperino:
<?php
$pippo = 'gawrsh!';
$pluto = 'bau!';
$paperino = 'quack!';
$nome = 'pippo';
echo $$nome.'<br>';
$nome = 'pluto';
echo $$nome.'<br>';
$nome = 'paperino';
echo $$nome.'<br>';
?>
Il risultato sul browser sarà gawrsh!, bau! e quack!, ciascuno sulla propria riga (infatti ogni istruzione print crea il tag HTML <br> che indica al browser di andare a capo; vedremo più avanti che il punto serve a concatenare i valori che vengono stampati). Il doppio segno del dollaro ci permette infatti di usare la variabile nome come contenitore del nome della variabile di cui vogliamo stampare il valore. In pratica, è come se avessimo detto a PHP: «stampa il valore della variabile che si chiama come il valore della variabile nome». Questo era un esempio banale, e l'uso delle variabili dinamiche era in realtà perfettamente inutile, in quanto sapevamo benissimo come si chiamavano le variabili che ci interessavano. Però in situazioni reali può capitare di trovarsi in un ambito nel quale non sappiamo come si chiamano le variabili, e dobbiamo usare altre variabili per ricavarne il nome, oltrechè il valore.
I tipi di dato
Una variabile può contenere diversi tipi di valori, ognuno dei quali ha un comportamento ed un'utilità differente. Analizzeremo brevemente i tipi di dato che PHP permette di utilizzare all'interno del proprio codice premettendo che PHP, a differenza di altri linguaggi, associa il tipo di dato al valore e non alla variabile (ad esempio possiamo assegnare alla stessa variabile una stringa e poi un numero senza incorrere in alcun errore) ed effettua conversioni automatiche dei valori nel momento in cui siano richiesti tipi di dato differenti (ad esempio in un'espressione).
Valore booleano
I tipi di dato boolean servono per indicare i valori vero o falso all'interno di espressioni logiche. Il tipo booleano è associato alle variabili che contengono il risultato di un'espressione booleana oppure i valori true e false. Vediamo un rapido esempio:
<?php
$vero = true;
$falso = false;
?>
Intero
Un numero intero, positivo o negativo, il cui valore massimo (assoluto) può variare in base al sistema operativo su cui gira PHP, ma che generalmente si può considerare, per ricordarlo facilmente, di circa 2 miliardi (2 elevato alla 31esima potenza).
<?php
$int1 = 129;
$int2 = -715;
$int3 = 5 * 8; //$int3 vale 40
?>
Virgola mobile
Un numero decimale (a volte citato come "double" o "real"). Attenzione: per indicare i decimali non si usa la virgola, ma il punto. Anche in questo caso la dimensione massima dipende dalla piattaforma. Normalmente comunque si considera un massimo di circa 1.8e308 con una precisione di 14 cifre decimali. Si possono utilizzare le seguenti sintassi:
<?php
$vm1 = 4.153; // 4,153
$vm2 = 3.2e5; // 3,2 * 10^5, cioè 320.000
$vm3 = 4E-8; // 4 * 10^-8, cioè 4/100.000.000 = 0,00000004
?>
Stringa
Una stringa è un qualsiasi insieme di caratteri, senza limitazione normalmente contenuto all'interno di una coppia di apici doppi o apici singoli. Le stringhe delimitate da apici sono la forma più semplice, consigliata quando all'interno della stringa non vi sono variabili di cui vogliamo ricavare il valore:
<?php
$frase = 'Anna disse: "Ciao a tutti!" ma nessuno rispose';
echo $frase;
?>
Questo codice stamperà la frase: 'Anna disse: "Ciao a tutti!" ma nessuno rispose'. Gli apici doppi ci consentono di usare le stringhe in una maniera più sofisticata, in quanto, se all'interno della stringa delimitata da virgolette PHP riconosce un nome di variabile, lo sostituisce con il valore della variabile stessa.
<?php
$nome = 'Anna';
echo "$nome è simpatica... a pochi"; // stampa: Anna è simpatica... a pochi
echo '$nome è simpatica... a pochi'; // stampa: $nome è simpatica... a pochi
echo "{$nome} è simpatica a pochi"; // è una sintassi alternativa, con lo stesso effetto della prima
?>
Ci sono un paio di regole molto importanti da ricordare quando si usano le stringhe delimitate da apici o virgolette: siccome può capitare che una stringa debba contenere a sua volta un apice o un paio di virgolette, abbiamo bisogno di un sistema per far capire a PHP che quel carattere fa parte della stringa e non è il suo delimitatore. In questo caso si usa il cosiddetto 'carattere di escape', cioè la barra rovesciata (backslash: \). Vediamo alcuni esempi:
<?php
echo 'Torniamo un\'altra volta'; // stampa: Torniamo un'altra volta
echo "Torniamo un'altra volta"; // stampa: Torniamo un'altra volta
echo "Torniamo un\'altra volta"; // stampa: Torniamo un\'altra volta
echo 'Torniamo un'altra volta'; // causa un errore, perchè l'apostrofo viene scambiato per l'apice di chiusura
echo 'Anna disse "Ciao" e se ne andò'; // stampa: Anna disse "Ciao" e se ne andò
echo "Anna disse \"Ciao\" e se ne andò"; // stampa: Anna disse "Ciao" e se ne andò
echo 'Anna disse \"Ciao\" e se ne andò'; // stampa: Anna disse \"Ciao\" e se ne andò
echo "Anna disse "Ciao" e se ne andò"; // errore
?>
Da questi esempi si può capire che il backslash deve essere utilizzato come carattere di escape quando vogliamo includere nella stringa lo stesso tipo di carattere che la delimita; se mettiamo un backslash davanti ad un apice doppio in una stringa delimitata da apici singoli (o viceversa), anche il backslash entrerà a far parte della stringa stessa, come si vede nel terzo e nel settimo esempio. Il backslash viene usato anche come 'escape di sè stesso', nei casi in cui vogliamo esplicitamente includerlo nella stringa:
<?php
echo "Questo: \"\\\" è un backslash"; // stampa: Questo: "\" è un backslash
echo 'Questo: \'\\\' è un backslash'); // stampa: Questo: '\' è un backslash
echo "Questo: '\' è un backslash"); // stampa: Questo: '\' è un backslash
echo "Questo: '\\' è un backslash"); // stampa: Questo: '\' è un backslash
?>
Analizziamo il primo esempio: il primo backslash fa l'escape del primo paio di virgolette; il secondo backslash fa l'escape del terzo, che quindi viene incluso nella stringa; il quarto fa l'escape del secondo paio di virgolette. Il secondo esempio equivale al primo, con l'uso degli apici al posto delle virgolette. Negli ultimi due casi non è necessario fare l'escape del backslash, in quanto il backslash che vogliamo stampare non può essere scambiato per un carattere di escape (infatti vicino ad esso ci sono degli apici, che in una stringa delimitata da virgolette non hanno bisogno di escape). Di conseguenza, fare o non fare l'escape del backslash in questa situazione è la stessa cosa, e difatti i due esempi forniscono lo stesso risultato.
Passiamo ad esaminare l'ultimo modo di rappresentare le stringhe: la sintassi heredoc, poco utilizzata se non in situazioni nelle quali è necessario specificare stringhe molto lunghe. Questa ci consente di delimitare una stringa con i caratteri <<< seguiti da un identificatore (in genere si usa EOD, ma è solo una convenzione: è possibile utilizzare qualsiasi stringa composta di caratteri alfanumerici e underscore, di cui il primo carattere deve essere non numerico: la stessa regola dei nomi di variabile). Tutto ciò che segue questo delimitatore viene considerato parte della stringa, fino a quando non viene ripetuto l'identificatore seguito da un punto e virgola. Attenzione: l'identificatore di chiusura deve occupare una riga a sè stante, deve iniziare a colonna 1 e non deve contenere nessun altro carattere (nemmeno spazi vuoti) dopo il punto e virgola.
<?php
$nome = "Paolo";
$stringa = <<<EOD
Il mio nome è $nome
EOD;
echo $stringa;
?>
Questo codice stamperà 'Il mio nome è Paolo'. Infatti la sintassi heredoc risolve i nomi di variabile così come le virgolette. Rispetto a queste ultime, con questa sintassi abbiamo il vantaggio di poter includere delle virgolette nella stringa senza farne l'escape:
<?php
$frase = "ciao a tutti";
$stringa = <<<EOT
Il mio saluto è "$frase"
EOT;
echo $stringa;
?>
In questo caso stamperemo 'Il mio saluto è "ciao a tutti"'.
Array
Possiamo considerare un array come una variabile complessa, che contiene una serie di valori, ciascuno dei quali caratterizzato da una chiave, o indice che lo identifica univocamente. Facciamo un primo esempio, definendo un array composto di cinque valori:
$colori = array('bianco', 'nero', 'giallo', 'verde', 'rosso');
A questo punto ciascuno dei nostri cinque colori è caratterizzato da un indice numerico, che PHP assegna automaticamente a partire da 0. Per recuperare un determinato valore dalla variabile che contiene l'array, è sufficiente specificare il suo indice all'interno di parentesi quadre dietro al nome della variabile:
echo $colori[1]; // stampa 'nero'
echo $colori[4]; // stampa 'rosso'
Gli array verranno trattati in modo più approfondito nella prossima lezione.
Oggetto
Le classi e gli oggetti sono due degli argomenti sui quali gli sviluppatori di PHP hanno voluto puntare maggiormente nella nuova versione. L'argomento verrà trattato in modo approfondito nella Guida Teorica a PHP.
Espressioni e operatori aritmetici di PHP
Gli operatori sono un altro degli elementi di base di qualsiasi linguaggio di programmazione, in quanto ci consentono non solo di effettuare le tradizionali operazioni aritmetiche, ma più in generale di manipolare il contenuto delle nostre variabili. Il più classico e conosciuto degli operatori è quello di assegnazione:
Operatore di assegnazione
$nome = 'Giorgio';
Il simbolo '=' serve infatti ad assegnare alla variabile $nome il valore 'Giorgio'. In generale, possiamo dire che con l'operatore di assegnazione prendiamo ciò che sta alla destra del segno di ugualianza ('=') ed assegnamo lo stesso valore a ciò che sta a sinistra. Potremmo ad esempio assegnare ad una variabile il valore di un'altra variabile:
$a = 5;
$b = $a;
Con la prima istruzione assegnamo ad $a il valore 5, con la seconda assegnamo a $b lo stesso valore di $a.
Altri operatori molto facili da comprendere sono quelli che permettono di effettuare operazioni aritmetiche sui dati: addizione, sottrazione, divisione, moltiplicazione, modulo.
Operazioni aritmetiche
$a = 3 + 7; // addizione
$b = 5 - 2; // sottrazione
$c = 9 * 6; // moltiplicazione
$d = 8 / 2; // divisione
$e = 7 % 4; // modulo
// (il modulo è il resto della divisione intera, in questo caso 3)
Uno degli operatori più utilizzati è quello che serve per concatenare le stringhe: il punto.
Concatenare le stringhe
$nome = 'pippo';
$stringa1 = 'ciao ' . $nome; // $stringa1 vale 'ciao pippo'
Con l'operatore di assegnazione si può anche usare una variabile per effettuare un calcolo il cui risultato deve essere assegnato alla variabile stessa. Ad esempio, supponiamo di avere una variabile di cui vogliamo aumentare il valore:
$a = $a + 10; // il valore di $a aumenta di 10
Con questa istruzione, viene eseguito il calcolo che sta alla destra del segno '=' ed il risultato viene memorizzato nella variabile indicata a sinistra. Risulta chiaro che il valore della variabile $a prima dell'istruzione viene utilizzato per il calcolo, ma dopo che l'istruzione è stata eseguita viene utilizzata per memorizzare il risultato, quindi il suo valore cambia.
Un risultato di questo tipo si può ottenere anche con gli operatori di assegnazione combinati, che ci permettono di rendere il codice più compatto:
Operazioni di calcolo
$x += 4; // incrementa $x di 4 (equivale a $x = $x + 4)
$x -= 3; // decrementa $x di 3 (equivale a $x = $x - 3)
$x .= $a; // il valore della stringa $a viene concatenato a $x (equivale a $x = $x . $a)
$x /= 5; // equivale a $x = $x / 5
$x *= 4; // equivale a $x = $x * 4
$x %= 2; // equivale a $x = $x % 2
In questo modo diciamo a PHP che vogliamo assegnare alla variabile specificata a sinistra il risultato dell'operazione che si trova prima del simbolo uguale applicandola alla variabile stessa ed al valore specificato a destra. Più facile a farsi che a dirsi.
Nel caso fosse necessario incrementare e decrementare una variabile di una sola unità, ci vengono incontro gli operatori di incremento e decremento:
Incremento e decremento
$a++; ++$a; // incrementa di 1
$a--; --$a; // decrementa di 1
La differenza tra anteporre e posporre l'operatore di incremento o decremento è fondamentale nel momento in cui si utilizzando questi operatori all'interno di espressioni. Per ora vi basti sapere che anteporre l'operatore alla variabile dice al compilatore di incrementare la variabile e successivamente utilizzare il suo valore all'interno dell'espressione, mentre posporre l'operatore informa il compilatore che dovrà utilizzare nell'espressione il valore attuale e successivamente applicarvi l'incremento o il decremento.
Gli operatori logici e le espressioni booleane in php
Gli operatori di confronto sono fondamentali perchè ci permettono, effettuando dei confronti fra valori, di prendere delle decisioni, cioè di far svolgere al nostro script determinate operazioni invece di altre. Quando utilizziamo gli operatori di confronto, confrontiamo i due valori posti a sinistra e a destra dell'operatore stesso.
Dopo aver valutato un'espressione questo tipo, PHP arriva a valutare se essa è vera o falsa. Quindi il risultato sarà di tipo booleano (true o false).
Operazioni di confronto
Operatore Descrizione
== uguale
!= diverso
=== identico (cioè uguale e dello stesso tipo: ad esempio per due variabili di tipo intero)
> maggiore
>= maggiore o uguale
< minore
<= minore o uguale
Vediamo alcuni esempi:
$a = 7; $b = 7.0; $c = 4; //assegnamo valori a tre variabili
$a == $b; // vero
$a == $c; // falso
$a === $b; // falso, perchè $a è intero mentre $b è float
$a > $c; // vero
$c >= $a; // falso, $c è minore di $a
$a < $b; // falso, hanno lo stesso valore
$c <= $b; // vero
Una piccola osservazione sul terzo confronto: siccome abbiamo assegnato il valore di $b usando la notazione col punto decimale, per PHP $b è una variabile del tipo in virgola mobile, anche se in realtà il suo valore è intero. Per questo il confronto di identità restituisce falso.
Fino a qui abbiamo visto comunque casi molto semplici perchè tutte le variabili avevano valori numerici. Gli stessi confronti però si possono fare anche con altri tipi di variabili, ed in particolare con le stringhe. In questo caso il confronto viene fatto basandosi sull'ordine alfabetico dei caratteri: vale a dire che vengono considerati 'minori' i caratteri che 'vengono prima' nell'ordine alfabetico. Quindi 'a' è minore di 'b', 'b' è minore di 'c', eccetera. Inoltre tutte le lettere minuscole sono 'maggiori' delle lettere maiuscole, e tutte, maiuscole e minuscole, sono 'maggiori' delle cifre da 0 a 9:
$a = 'Mario'; $b = 'Giorgio'; $c = 'Giovanni'; $d = 'antonio'; $e = '4 gatti';
$a < $b; // falso, la 'G' precede la 'M'
$b < $c; // vero, la 'r' ('Gior') precede la 'v' ('Giov')
$d > $a; // vero, la 'a' minuscola è 'maggiore' di qualsiasi lettera maiuscola
$c > $e; // vero, ogni lettera è 'maggiore' di qualsiasi cifra
Dato che PHP è un linguaggio con una tipizzazione debole permette di confrontare tra loro variabili contenenti tipi di dato differenti cercando di trasformare le variabili in valori confrontabili. Se per esempio effettuassimo un confronto (==) tra una variabile contenente l'intero uno (1) ed una contenente la stringa uno ('1') otterremmo un valore di verità dato che PHP trasformerebbe entrambi i valori in numeri in modo che siano confrontabili. Per assegnare questo valore numerico, PHP controlla se all'inizio della stringa ci sono dei numeri: se ne trova, considererà tutti i numeri che trova inizialmente come il valore numerico di quella stringa. Se non ne trova, il valore della stringa sarà 0:
$a = 7; $b = 5; $c='molte persone'; $d='7 persone'; $e='5';
$a == $d; // vero, $d vale 7
$a === $d; // falso, valgono entrambi 7 ma $a è un intero mentre $d è una stringa
$b > $c; // vero, $b vale 5 mentre $c vale 0
$e > $c; // falso: questo è un confronto fra due stringhe, quindi valgono le regole viste prima
Prestiamo attenzione all'ultimo esempio: il valore di $e era stato assegnato usando gli apici, e questo fa sì che PHP lo consideri una stringa anche se il contenuto è un numero.
Il confronto fra un numero e una stringa può avvenire in maniera voluta, ma è più probabile che avvenga per caso, quando cioè una variabile che pensavamo contenesse un numero contiene in realtà una stringa. È evidente che in questo caso potremo facilmente ottenere un risultato diverso da quello che ci aspettavamo, o, viceversa, potremmo ottenere casualmente il risultato atteso: in quest'ultima situazione è possibile che risultati inaspettati arrivino più avanti nello script, se utilizzeremo di nuovo la stessa variabile.
In tutte queste situazioni, tener presente il modo in cui PHP tratta questi confronti può essere di aiuto per spiegarci comportamenti apparentemente bizzarri del nostro script. È comunque buona norma assicurarsi che due espressioni restituiscano risultati dello stesso tipo quando si effettuano confronti, oppure utilizzare gli operatori === e !== che tengono conto anche del tipo di dato utilizzato.
Gli operatori logici
Con gli operatori logici possiamo combinare più valori booleani, oppure negarne uno (nel caso di NOT). Questi valori sono:
Operatore Descrizione
Or o || valuta se almeno uno dei due operatori è vero; si può indicare con ' Or oppure col "doppio pipe" (||)
And o && valuta se entrambi gli operatori sono veri; si indica con And o con la doppia "e commerciale" (&&)
Xor viene chiamato anche 'or esclusivo', e valuta se uno solo dei due operatori è vero: l'altro deve essere falso; si indica con Xor
! è l'operatore 'not' e vale come negazione. Si usa con un solo operatore: è vero quando l'operatore è falso, e viceversa; si indica con il punto esclamativo (!)
Anche in questa occasione vediamo qualche esempio:
10 > 8 And 7 < 6; // falso, perchè la prima condizione è vera ma la seconda è falsa
10 > 8 Or 7 < 6; // vero
9 > 5 And 5 == 5; // vero, entrambe le condizioni sono vere
9 > 5 Xor 5 == 5; // falso, solo una delle due deve essere vera perchè si verifichi lo 'Xor'
4 < 3 || 7 > 9; // falso, nessuna delle due condizioni è vera
6 == 6 && 1 > 4; // falso, solo la prima condizione è vera
Per quanto riguarda gli operatori 'and' e 'or', le due diverse notazioni differiscono per il livello di precedenza in caso di espressioni complesse. Infatti, siccome è possibile combinare molti operatori in espressioni anche assai complicate, è necessario sapere con quale ordine PHP valuta i diversi operatori. Queste regole ricalcano le regole algebriche in base alle quali moltiplicazioni e divisioni hanno la precedenza su addizioni e sottrazioni, ma sono più complesse perchè devono considerare anche gli altri operatori. Vediamo quindi qual è l'ordine di priorità dei diversi operatori, iniziando da quelli che hanno la priorità maggiore:
Operatori di incremento e decremento (++ --)
Moltiplicazione, divisione, modulo (* / %)
Addizione e sottrazione (+ -)
Operatori di confronto per minore e maggiore (< <= => >)
Operatori di confronto per uguaglianza e disuguaglianza (== === !=)
Operatore logico 'and', nella notazione col simbolo (&&)
Operatore logico 'or', nella notazione col simbolo (||)
Operatori di assegnazione, compresi quelli 'sintetici' (= += -= /= *= %= .=)
Operatore logico 'and', nella notazione letterale (And)
Operatore logico 'xor' (Xor)
Operatore logico 'or', nella notazione letterale (Or)
Abbiamo già visto prima, in occasione degli esempi sugli operatori logici, l'applicazione di questi principi di precedenza: infatti in tutte quelle espressioni venivano valutati prima gli operatori di confronto e, solo dopo, quelli logici. Un'altra classica rappresentazione di esempio è quella dell'espressione algebrica:
5 + 4 * 2; // questa espressione vale 13 e non 18,
// perché la moltiplicazione viene eseguita prima
(5 + 4) * 2; // questa invece vale 18, perché le parentesi modificano
// l'ordine di esecuzione
Come abbiamo visto, così come avviene in algebra, usando le parentesi possiamo determinare a nostro piacere quali operatori devono essere valutati per primi. Per questo motivo, sebbene sia possibile imparare a memoria l'ordine di precedenza che abbiamo visto poco fa, il nostro consiglio è quello di non tenerne conto, e di utilizzare sempre le parentesi quando abbiamo bisogno di costruire un'espressione un po' complessa: in questo modo ridurremo il rischio di errori, e soprattutto renderemo il nostro codice molto più leggibile. Infatti leggere un'espressione regolata dalle parentesi è molto più immediato che non doversi ricordare quali degli operatori hanno la precedenza sugli altri.
Le espressioni
Dopo questa breve introduzione sugli operatori, possiamo definire un'espressione come una qualsiasi combinazione di funzioni (v. lezioni successive), valori e operatori che si risolvono in un valore. Nel caso visto prima, l'espressione 7+3 ha come valore 10.
In generale, in PHP, qualsiasi cosa utilizzabile come un valore può essere considerata un'espressione. Vediamo alcuni rapidi esempi:
15 * 3; // espressione il cui valore è 45
'Giacomo' . ' Verdi'; // espressione il cui valore è 'Giacomo Verdi'
$a + $b; // espressione il cui valore è dato dalla somma
// dei valori delle variabili $a e $b
Come possiamo vedere, quindi, la presenza di operatori fa sì che il valore dell'espressione risulti diverso da quello dei singoli valori che fanno parte dell'espressione stessa. Vediamo un caso particolare, quello dell'operatore di assegnazione:
$a = 6; // il valore di questa espressione è 6
Quando usiamo una espressione per assegnare un valore ad una variabile, il valore che tale espressione assume è uguale a quello che si trova a destra dell'operatore di assegnazione (che è anche quello che viene assegnato all'operatore di sinistra). Questo significa che noi possiamo scrivere
echo 'Paolo'; // stampa 'Paolo'
echo ($nome = 'Paolo'); // stampa sempre 'Paolo'
Le due espressioni hanno infatti lo stesso valore, cioè 'Paolo'. Quindi con le due istruzioni viste sopra otteniamo sul browser lo stesso risultato. La differenza, ovviamente, è che con la seconda, oltre a stampare il valore a video, abbiamo anche assegnato lo stesso valore alla variabile $nome.
Vediamo qualche altro esempio:
7 > 4; //valore dell'espressione: true (vero)
$a = 7 > 4; //valore dell'espressione: lo stesso di prima;
//la variabile $a assume quindi il valore true
$b = 5 * 4; //valore dell'espressione: 20; viene assegnato a $b
Precedentemente avevamo accennato ad una differenza nella valutazione dell'espressione fra i diversi modi di utilizzare gli operatori di incremento e di decremento. Vediamo ora di approfondire questo concetto:
$a = 10;
$b = 10;
++$a; // incrementiamo $a, che diventa 11; l'espressione vale 11
$b++; // anche $b diventa 11; qui però l'espressione vale 10
La differenza è questa: se usiamo l'operatore di incremento (o di decremento) prima della variabile, l'espressione assume il nuovo valore della variabile stessa. Se invece lo mettiamo dopo, l'espressione prenderà il valore che la variabile aveva prima dell'operazione. Di conseguenza:
$a = 5;
$b = 5;
echo ++$a; // $a diventa 6, e viene stampato '6'
echo $b++; // anche $b diventa 6, ma viene stampato '5'
echo ++$b; // a questo punto $b è diventato 7, e viene stampato '7'
Istruzione If
Con le strutture di controllo andiamo ad analizzare un altro degli aspetti fondamentali della programmazione: la possibilità cioè di eseguire operazioni diverse, ed eventualmente di eseguirle più volte, in base alla valutazione di determinate condizioni. In questa lezione esamineremo le istruzioni che ci permettono di eseguire o non eseguire certe porzioni di codice.
If
La principale di queste istruzioni è la if, la cui sintassi più elementare è la seguente:
if( <condizione> ) {
<codice>
}
Dopo l'if, deve essere indicata fra parentesi un'espressione da valutare (condizione). Questa espressione verrà valutata in senso booleano, cioè il suo valore sarà considerato vero o falso. Nel caso in cui l'espressione non abbia un valore booleano, PHP convertirà comunque questo valore in booleano utilizzando precise regole che vedremo tra qualche riga. Dunque, se la condizione è vera, l'istruzione successiva viene eseguita. In caso contrario, viene ignorata. Potremmo anche avere la necessità di eseguire, nel caso in cui la condizione sia vera, non una sola ma più istruzioni. Questo è perfettamente possibile, ma dobbiamo ricordarci di comprendere questo blocco di istruzioni fra due parentesi graffe, ad esempio così:
// ....
if ($nome == 'Luca') {
echo "ciao Luca!<br>";
echo "dove sono i tuoi amici?<br>";
}
echo "ciao a tutti voi";
In questo modo, se la variabile $nome ha effettivamente il valore 'Luca' vengono eseguite le due istruzioni successive, comprese fra le parentesi graffe. Dopo avere valutato la condizione ed eventualmente eseguito le due istruzioni previste, lo script proseguirà con ciò che sta fuori dalle parentesi graffe. Quindi nel nostro esempio la frase "ciao a tutti voi" viene prodotta in ogni caso. È buona norma usare comunque le parentesi graffe per delimitare il codice condizionato, anche quando è costituito da una sola istruzione: infatti questo rende il codice più leggibile, ed inoltre potrebbe evitarci degli errori se ci dovesse capitare di voler aggiungere delle istruzioni al blocco condizionato dimenticando di aggiungere le graffe.
Dobbiamo notare un particolare, riguardo alla sintassi di questa istruzione: per la prima volta, vediamo che in questo costrutto mancano i punto e virgola. Infatti la if e la condizione espressa fra parentesi non devono averli; continuiamo invece a metterli nel blocco di codice condizionato.
Abbiamo detto poco fa che la condizione espressa fra parentesi potrebbe non avere un valore booleano. PHP però è in grado di considerare booleano qualsiasi valore, in base ad alcune regole molto semplici. Facciamo un altro esempio banale:
if (5) {
print "ciao Luca!";
}
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à sempre stampata. Questo perchè, per PHP, il valore 5, così come qualsiasi numero diverso da 0, è considerato 'vero'. In sostanza, PHP considera come falsi:
il valore numerico 0, 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. Quindi anche la banale espressione che abbiamo utilizzato nell'esempio di prima.
Analizziamo ora un caso che spesso crea problemi se non viene compreso fin dalle prime battute. Vediamo questo codice
$a = 7;
if ($a = 4)
echo '$a è uguale a 4!';
A prima vista, qualcuno potrebbe essere ingannato da queste istruzioni, soprattutto chi ha precedenti esperienze di programmazione in linguaggi strutturati diversamente, nei quali un'espressione come $a = 4 potrebbe essere sia un'assegnazione che un test. Costoro infatti si aspetteranno che questo blocco di codice non stampi niente, e rimarrebbero molto sorpresi, qualora lo provassero, di vedere invece sul browser la frase '$a è uguale a 4'.
Questo succederebbe perchè l'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 è un valore vero. Se invece che 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, quando vogliamo verificare se il valore di una variabile è uguale a qualcosa, di utilizzare l'operatore condizionale di uguaglianza, cioè il doppio uguale ("=="). In caso contrario, non solo otterremo molto spesso risultati diversi da quelli che ci saremmo aspettati, ma avremo anche modificato il valore di una variabile che volevamo soltanto verificare.
Istruzioni Else e Eseif
Else
Andiamo ora un po' più a fondo nell'analisi dell'istruzione if: essa infatti ci permette non solo di indicare quali istruzioni vogliamo eseguire se la condizione è vera, ma anche di esprimere un blocco di codice da eseguire quando la condizione è falsa. Ecco come:
If (<condizione>) {
<codice>
} else {
<codice>
}
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' viene ignorato quando la condizione è vera, mentre viene eseguito se la condizione è falsa.
Le istruzioni if possono essere nidificate una dentro l'altra, consentendoci così di creare codice di una certa complessità. Esempio:
if ($nome == 'Luca') {
if ($cognome == 'Rossi') {
print "Luca Rossi è di nuovo fra noi";
} else {
print "Abbiamo un nuovo Luca!";
}
} else {
print "ciao $nome!";
}
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 questa 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 è falsa.
if ($nome == 'Luca') {
print "bentornato Luca!";
} elseif ($cognome == 'Verdi') {
print "Buongiorno, signor Verdi";
} else {
print "ciao $nome!";
}
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 saltati.
Istruzione Switch e operatore terniario
Switch
Passiamo ora a verificare una seconda istruzione che ci permette di prevedere diversi valori possibili per un'espressione ed eseguire codice specifico in base al valore:
switch (<condizione>) {
case <valore 1>:
<codice>
break;
case <valore 1>:
<codice>
break;
....
default:
<codice>;
break;
}
L'istruzione switch prevede che indichiamo, fra parentesi, un'espressione che verrà valutata per il suo valore (questa volta non si tratta necessariamente di un valore booleano). Di seguito, tra parentesi graffe, esprimeremo una serie di espressioni da confrontare con quella indicata prima: dal momento in cui ne trova una il cui valore è uguale, PHP esegue il codice indicato di seguito, fino a quando non incontra un'istruzione break. Come possiamo vedere dall'esempio, le espressioni da confrontare con la prima vengono precedute dalla parola chiave case e seguite dai due punti. L'istruzione default può essere indicata come 'ultimo caso', che si considera verificato quando nessuno dei casi precedenti è risultato vero. L'indicazione default può anche essere assente.
È molto importante comprendere la funzione dell'istruzione break in questa situazione: infatti, quando PHP verifica uno dei casi, esegue non solo il codice che trova subito dopo, ma anche tutto quello che trova di seguito, compreso quello relativo ai casi seguenti. Questo fino a quando non trova, appunto, un'istruzione break. Se non mettessimo un'istruzione break alla fine di un blocco di codice relativo ad un caso particolare, l'esecuzione continuerebbe eseguendo anche il case successivo. Questo comportamento ci permette però di prevedere un unico comportamento per più valori dell'espressione sotto esame:
switch ($nome) {
case 'Luca':
case 'Giorgio':
case 'Franco':
print "Ciao, vecchio amico!";
break;
case 'Mario':
print "Ciao, Mario!";
break;
case 'Paolo':
print "Finalmente, Paolo!";
break;
default:
print "Benvenuto, chiunque tu sia";
}
In questo caso, abbiamo previsto un unico messaggio per il caso in cui la variabile $nome valga 'Luca', 'Giorgio' o 'Franco'.
L'operatore ternario
L'operatore ternario è 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 una if.
($altezza >= 180) ? 'alto' : 'normale' ;
Questa espressione prenderà il valore 'alto' se la variabile $altezza è maggiore o uguale a 180, e 'normale' nel caso opposto. Come vediamo, 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:
$tipologia = ($altezza >= 180) ? 'alto' : 'normale';
equivale a scrivere
if ($altezza >= 180) $tipologia = 'alto' ;
else
$tipologia = 'normale';
Come potete vedere, in termini di spazio il risparmio è abbastanza significativo. Bisogna però stare attenti ad abusare di questa forma, perchè a volte può rendere più difficoltosa la leggibilità del nostro script, anche se risulta di indubbia utilità nel caso in cui si necessiti rendere più compatto il codice.
I cicli:for, while e do
I cicli sono un altro degli elementi fondamentali di qualsiasi linguaggio di programmazione, in quanto ci permettono di eseguire determinate operazioni in maniera ripetitiva. È una necessità che si presenta molto spesso: infatti non è raro che un programma o uno script debbano elaborare quantità anche molto grosse di dati; in questa situazione, si prevederà il trattamento da utilizzare per ogni singolo dato (o gruppo di dati correlati), che sarà poi ripetuto per tutte le ricorrenze di tali dati.
Ciclo For
Iniziamo subito con un esempio (come al solito abbastanza banale): supponiamo di voler mostrare i multipli da 1 a 10 di un numero, ad esempio 5. La prima soluzione è quella di usare il 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 seguito, 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 risulta falsa, l'esecuzione del ciclo viene interrotta, ed il controllo passa alle istruzioni 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 abbiamo visto sopra, 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.
Con il ciclo for, così come con tutti gli altri cicli, è molto importante stare attenti a non creare una situazione in cui il ciclo non raggiunge mai una via d'uscita (il cosiddetto 'loop'): in questo caso, infatti, lo script rieseguirebbe il nostro ciclo all'infinito. Nel nostro esempio di prima potrebbe succedere, ad esempio, se sbagliassimo a scrivere 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 questo modo $mul rimarrebbe sempre uguale ad 1, ed il nostro ciclo stamperebbe all'infinito "5 * 1 = 5", perchè $mul non diventerebbe mai maggiore di 10.
In molte situazioni classiche di programmazione, un errore di questo genere potrebbe costringerci a forzare la chiusura del programma o addirittura a spegnere la macchina: nel caso di PHP, questo di solito non succede, in quanto gli script PHP hanno un limite di tempo per la loro esecuzione, oltre il quale si arrestano. Tale limite è normalmente di 30 secondi, ed è 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 specie 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 con un esempio come ottenere 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 ci 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, comunque, il concetto fondamentale è che l'esecuzione del ciclo termina quando la condizione fra parentesi non è più verificata: ancora una volta, quindi, è possibile che il ciclo non sia eseguito mai, nel caso in cui la condizione risulti falsa fin da subito.
Il ciclo do...while
Esiste invece 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 del nostro esempio, 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".
Uscire da un ciclo
Abbiamo visto che PHP termina l'esecuzione di un ciclo quando la condizione a cui è sottoposto non è più verificata. Abbiamo però a disposizione altri strumenti per modificare il comportamento del nostro script dall'interno del ciclo: infatti possiamo dire a PHP di non completare la presente iterazione e passare alla successiva (con continue) oppure di interrompere definitivamente l'esecuzione del ciclo (con break). Vediamo un esempio:
for ($ind = 1; $ind < 500; $ind++) {
if ($ind % 100 == 0) {
break;
}elseif ($ind % 25 == 0) {
continue;
}
echo "valore: $ind <br/>";
}
Questo codice imposta un ciclo per essere eseguito 500 volte, con valori di $ind che vanno da 1 a 500. In realtà, le istruzioni che abbiamo posto al suo interno fanno sì che la stampa del valore di $ind non venga eseguita ogni volta che $ind corrisponde ad un multiplo di 25 (infatti l'istruzione 'continue' fa sì che PHP salti la 'print' e passi direttamente all'iterazione successiva, incrementando la variabile), e che il ciclo si interrompa del tutto quando $ind raggiunge il valore 100.
Ciclo Foreach
Esiste un ultimo tipo di ciclo, ed è un ciclo particolare perchè è costruito appositamente per il trattamento degli array e di particolari oggetti chiamati Iteratori: si tratta del foreach. Questo ci permette di costruire un ciclo che viene ripetuto per ogni elemento di una collezione passata come argomento. La sintassi è la seguente:
foreach ($arr as $chiave => $valore) {
<codice>
}
All'interno delle parentesi graffe avremo a disposizione, nelle due variabili che abbiamo definito $chiave e $valore, l'indice e il contenuto dell'elemento che stiamo trattando. È da notare che, nel caso ci interessi soltanto il valore e non la chiave (ad esempio perchè le chiavi sono numeriche), possiamo anche evitare di estrarre la chiave stessa:
foreach ($arr as $valore) {
<codice>
}
fonte:italian web side
<?php
.....
?>
Abbiamo però la possibilità di usare anche alcune sintassi alternative, che sono comunque sconsigliate per permettere una corretta distribuzione e portabilità dei propri progetti. In primo luogo, in script scritti in versioni precedenti di PHP, potremmo trovare il classico tag <script> con specificato esplicitamente il linguaggio PHP:
<script language="php">
.......
</script>
Un'altra possibilità è quella di usare i tag brevi, che devono essere abilitati manualmente modificando le impostazioni del file di configurazione php.ini:
<?
....
?>
Ricordiamoci tuttavia che in PHP 5 la configurazione standard disabilita i tag brevi. Un'ultima possibilità è quella di usare i tag in "stile ASP":
<%
....
%>
Anche questi però devono essere abilitati in php.ini e sono praticamente inutilizzati dalla maggior parte dei programmatori. Tutta questa varietà di sintassi è causata dalla volontà degli sviluppatori di mantenere la retrocompatibilità con le vecchie versioni che, a causa di scelte differenti di design, permettevano l'utilizzo di tag alternativi. È bene ricordare che rimane buona pratica utilizzare i tag completi evitando se possibile i tag brevi ed escludendo le altre possibilità.
Per chi non ci avesse fatto caso, puntualizzo un concetto molto importante: i tag delimitano il codice PHP, ed il codice contenuto al loro interno non sarà inviato al browser, ma compilato e eseguito. Da questo potremmo dedurre che tutto ciò che sta fuori da questi tag non verrà toccato da PHP, che si limiterà a passarlo al browser così com'è, eventualmente ripetendolo in base a situazioni particolari che vederemo in seguito. In linea di massima è bene ricordare che scrivere:
<?php
echo "<strong>";
?>
prova</strong>
e:
<strong>prova</strong>
(o qualsiasi altra combinazione) restituisce lo stesso risultato.
I commenti
Un altro argomento molto importante legato alla sintassi di PHP sono i commenti. Chi ha esperienza, anche minima, di programmazione, sa bene che molte volte i commenti si rivelano di importanza decisiva quando si tratta di mettere le mani su un programma realizzato da qualcun altro, e anche quando il programma è stato scritto da noi stessi, soprattutto se è passato qualche tempo dalla realizzazione. I commenti svolgono un ruolo fondamentale in questa fase di "rivisitazione" del codice, in quanto possono facilitare di molto la comprensione di passaggi apparentemente oscuri.
È bene quindi non risparmiare mai un commento quando possibile (senza comunque esagerare altrimenti, al posto di chiarire il codice lo renderete ancora più illeggibile), anche perchè il loro utilizzo non appesantisce l'esecuzione dello script (l'interprete PHP salta tutte le parti che riconosce come commenti), nè il trasferimento della pagina al browser (infatti i commenti, essendo contenuti all'interno del codice PHP, fanno parte di ciò che non viene inviato al browser).
Abbiamo tre diverse possibilità per posizionare i commenti all'interno del nostro codice: la prima è l'uso dei commenti in stile C++, caratterizzati da due barre:
<?php
// Commento in stile C++
?>
La seconda sono i commenti in stile Perl e Python, contraddistinti dall'uso del cancelletto (anche se ormai obsoleti e poco utilizzati):
<?php
# Commento in stile Perl
# e python
?>
Entrambi questi tipi di commenti sono limitati ad una sola riga: l'interprete PHP, quando trova le barre o il cancelletto, salta tutto ciò che si trova da quel punto fino al termine della riga. Questo ci permette di porre il commento anche sulla stessa riga del codice commentato, così:
<?php
echo 'Buongiorno a tutti <br />';
//stampo un messaggio di saluto
print 'Esclusi quelli antipatici';
# faccio una precisazione
// Questa riga contiene solo commento
?>
L'ultimo tipo di commento che abbiamo a disposizione permette di specificare commenti multilinea senza dover ripetere i caratteri ogni nuova riga grazie ad una coppia di caratteri utilizzati per l'apertura e la chiusura. Tutto il codice che segue /* viene considerato commento da PHP finchè non incontra la serie di caratteri */. Un semplice esempio:
<?php
/*
Questo è un commento
multiriga specificando
utilizzando la stessa sintassi
usata in Java e C
*/
echo /* commento */ "Ciao a tutti" /* i commenti vengono saltati*/;
?>
Riguardo i commenti multilinea, è importante ricordare che non possono essere innestati e che comunque rappresentano un separatore per l'interprete PHP. Per questo motivo le seguenti sintassi sono errate:
<?php
/*
Commento /*
multilinea
*/
Qui verrà generato un errore ...
*/
ec/* questa sintassi è errata */ho "prova";
?>
La scelta di quale tipo di commento utilizzare è solitamente soggettiva, anche se spesso vengono utilizzati i commenti multiriga per documentare il codice e quelli a riga singola per aggiungergli dei semplici appunti sul funzionamento logico.
Le variabili
Le variabili sono componenti fondamentali di qualsiasi linguaggio di programmazione, in quanto ci consentono di trattare i dati del nostro programma senza sapere a priori quale sarà il loro valore. Possiamo immaginare una variabile come una specie di contenitore all'interno del quale viene conservato il valore che ci interessa, e che può cambiare di volta in volta.
In PHP possiamo scegliere il nome delle variabili usando lettere, numeri ed il trattino di sottolineatura, o underscore (_). Il primo carattere del nome deve essere però una lettera o un underscore (non un numero).
Dobbiamo inoltre ricordare che il nome delle variabili è sensibile all'uso delle maiuscole e delle minuscole: di conseguenza, se scriviamo due volte un nome di variabile usando le maiuscole in maniera differente, per PHP si tratterà di due variabili distinte!
In PHP il nome delle variabili è preceduto dal simbolo del dollaro ($). PHP ha una caratteristica che lo rende molto più flessibile rispetto ad altri linguaggi di programmazione: non richiede, infatti, che le variabili vengano dichiarate prima del loro uso. Possiamo quindi permetterci di riferirci ad una variabile direttamente con la sua valorizzazione:
<?php
$a = 5;
?>
Con questa riga di codice definiamo la variabile a, assegnandole il valore 5. In fondo all'istruzione abbiamo il punto e virgola, che, come già accennato in precedenza, deve chiudere tutte le istruzioni PHP. L'utilità di una variabile diventa fondamentale nel momento in cui è possibile utilizzarla all'interno di espressioni matematiche o logiche. Vediamo un semplice esempio:
<?php
$a = 9;
$b = 4;
$c = $a * $b;
echo "Il risultato dell'operazione (9 * 4) è :";
echo $c;
?>
In questo brano di codice abbiamo valorizzato tre variabili: a, alla quale stavolta abbiamo dato il valore 9; b, a cui abbiamo assegnato il valore 4 e c, che dovrà assumere il valore del prodotto di a e b. Infine abbiamo stampato il risultato ottenuto. Evidentemente, dopo l'esecuzione del codice c varrà 36.
Negli esempi abbiamo visto l'inizializzazione delle variabili, termine che sta ad indicare la prima volta in cui assegniamo un valore ad una variabile. In realtà, possiamo riferirci ad una variabile anche senza che sia stata inizializzata, anche se questa risulta un'operazione sconsigliata e potrebbe generare errori durante l'esecuzione in base ad alcune direttive di configurazione di PHP che vedremo più avanti. Ad esempio, supponendo che nel nostro script non sia stata valorizzata nessuna variabile z, potremmo avere un'istruzione di questo genere:
<?php
echo $z;
?>
Questo codice non produrrà alcun output, in quanto la variabile z non esiste. Gli errori generati quando si cerca di utilizzare in lettura una variabile non inizializzata sono di tipo E_NOTICE: sono gli errori di livello più basso, cioè meno gravi, che normalmente non vengono mostrati da PHP, ma che possiamo abilitare attraverso il file di configurazione php.ini. Un errore di questo genere in effetti non compromette il buon funzionamento dello script, che infatti viene eseguito regolarmente; però potrebbe essere ugualmente indice di un qualche errore commesso da chi ha scritto il codice. Facciamo un esempio per chiarire meglio quanto esposto:
<?php
$a = 74;
$b = 29;
$risultato = $a + $b;
echo $risulato;
?>
Questo codice vorrebbe assegnare i valori 74 e 29 a due variabili, poi sommarli e infine stampare il risultato. Però contiene un errore: nell'istruzione di stampa abbiamo indicato la variabile risulato invece che risultato. Chi ha scritto il codice si aspetterebbe di vedere comparire sul browser il risultato 103, invece non troverà proprio nulla, perchè la variabile risulato non è definita, e quindi non ha nessun valore.
Si può perdere anche molto tempo alla ricerca del problema (in realtà questo sembra un problema banalissimo, ed in effetti lo è; però ricordiamoci che un caso del genere potrebbe presentarsi in un contesto molto più complesso, ed inoltre molto spesso un errore semplice come questo si dimostra molto più difficile da scovare per chi lo ha commesso). Qui però la segnalazione di errore di PHP può venirci in aiuto: infatti, se siamo abituati ad utilizzare le variabili nella maniera più corretta, cioè dopo averle inizializzate, un errore come questo ci indica chiaramente che abbiamo sbagliato a scrivere il nome. Per questo il nostro consiglio è quello di tenere abilitata la visualizzazione degli errori anche di tipo E_NOTICE, e di utilizzare le variabili solo se inizializzate o dopo aver controllato la loro esistenza.
In questo modo impareremo da subito a programmare in maniera più corretta e, anche se impiegheremo qualche minuto in più per cominciare, risparmieremo tante ore (e tanto fegato) per il futuro...
Concludiamo questa lezione sulle variabili con un accenno alle variabili dinamiche, pratica tuttora sconsigliata ma che potrebbe capitarvi di incontrare in contesti relativi a script di vecchia fattura; in qualche situazione può presentarsi la necessità di utilizzare delle variabili senza sapere a priori il loro nome. In questi casi, il nome di queste variabili sarà contenuto in ulteriori variabili. Facciamo un esempio: col codice seguente stamperemo a video il contenuto delle variabili pippo, pluto e paperino:
<?php
$pippo = 'gawrsh!';
$pluto = 'bau!';
$paperino = 'quack!';
$nome = 'pippo';
echo $$nome.'<br>';
$nome = 'pluto';
echo $$nome.'<br>';
$nome = 'paperino';
echo $$nome.'<br>';
?>
Il risultato sul browser sarà gawrsh!, bau! e quack!, ciascuno sulla propria riga (infatti ogni istruzione print crea il tag HTML <br> che indica al browser di andare a capo; vedremo più avanti che il punto serve a concatenare i valori che vengono stampati). Il doppio segno del dollaro ci permette infatti di usare la variabile nome come contenitore del nome della variabile di cui vogliamo stampare il valore. In pratica, è come se avessimo detto a PHP: «stampa il valore della variabile che si chiama come il valore della variabile nome». Questo era un esempio banale, e l'uso delle variabili dinamiche era in realtà perfettamente inutile, in quanto sapevamo benissimo come si chiamavano le variabili che ci interessavano. Però in situazioni reali può capitare di trovarsi in un ambito nel quale non sappiamo come si chiamano le variabili, e dobbiamo usare altre variabili per ricavarne il nome, oltrechè il valore.
I tipi di dato
Una variabile può contenere diversi tipi di valori, ognuno dei quali ha un comportamento ed un'utilità differente. Analizzeremo brevemente i tipi di dato che PHP permette di utilizzare all'interno del proprio codice premettendo che PHP, a differenza di altri linguaggi, associa il tipo di dato al valore e non alla variabile (ad esempio possiamo assegnare alla stessa variabile una stringa e poi un numero senza incorrere in alcun errore) ed effettua conversioni automatiche dei valori nel momento in cui siano richiesti tipi di dato differenti (ad esempio in un'espressione).
Valore booleano
I tipi di dato boolean servono per indicare i valori vero o falso all'interno di espressioni logiche. Il tipo booleano è associato alle variabili che contengono il risultato di un'espressione booleana oppure i valori true e false. Vediamo un rapido esempio:
<?php
$vero = true;
$falso = false;
?>
Intero
Un numero intero, positivo o negativo, il cui valore massimo (assoluto) può variare in base al sistema operativo su cui gira PHP, ma che generalmente si può considerare, per ricordarlo facilmente, di circa 2 miliardi (2 elevato alla 31esima potenza).
<?php
$int1 = 129;
$int2 = -715;
$int3 = 5 * 8; //$int3 vale 40
?>
Virgola mobile
Un numero decimale (a volte citato come "double" o "real"). Attenzione: per indicare i decimali non si usa la virgola, ma il punto. Anche in questo caso la dimensione massima dipende dalla piattaforma. Normalmente comunque si considera un massimo di circa 1.8e308 con una precisione di 14 cifre decimali. Si possono utilizzare le seguenti sintassi:
<?php
$vm1 = 4.153; // 4,153
$vm2 = 3.2e5; // 3,2 * 10^5, cioè 320.000
$vm3 = 4E-8; // 4 * 10^-8, cioè 4/100.000.000 = 0,00000004
?>
Stringa
Una stringa è un qualsiasi insieme di caratteri, senza limitazione normalmente contenuto all'interno di una coppia di apici doppi o apici singoli. Le stringhe delimitate da apici sono la forma più semplice, consigliata quando all'interno della stringa non vi sono variabili di cui vogliamo ricavare il valore:
<?php
$frase = 'Anna disse: "Ciao a tutti!" ma nessuno rispose';
echo $frase;
?>
Questo codice stamperà la frase: 'Anna disse: "Ciao a tutti!" ma nessuno rispose'. Gli apici doppi ci consentono di usare le stringhe in una maniera più sofisticata, in quanto, se all'interno della stringa delimitata da virgolette PHP riconosce un nome di variabile, lo sostituisce con il valore della variabile stessa.
<?php
$nome = 'Anna';
echo "$nome è simpatica... a pochi"; // stampa: Anna è simpatica... a pochi
echo '$nome è simpatica... a pochi'; // stampa: $nome è simpatica... a pochi
echo "{$nome} è simpatica a pochi"; // è una sintassi alternativa, con lo stesso effetto della prima
?>
Ci sono un paio di regole molto importanti da ricordare quando si usano le stringhe delimitate da apici o virgolette: siccome può capitare che una stringa debba contenere a sua volta un apice o un paio di virgolette, abbiamo bisogno di un sistema per far capire a PHP che quel carattere fa parte della stringa e non è il suo delimitatore. In questo caso si usa il cosiddetto 'carattere di escape', cioè la barra rovesciata (backslash: \). Vediamo alcuni esempi:
<?php
echo 'Torniamo un\'altra volta'; // stampa: Torniamo un'altra volta
echo "Torniamo un'altra volta"; // stampa: Torniamo un'altra volta
echo "Torniamo un\'altra volta"; // stampa: Torniamo un\'altra volta
echo 'Torniamo un'altra volta'; // causa un errore, perchè l'apostrofo viene scambiato per l'apice di chiusura
echo 'Anna disse "Ciao" e se ne andò'; // stampa: Anna disse "Ciao" e se ne andò
echo "Anna disse \"Ciao\" e se ne andò"; // stampa: Anna disse "Ciao" e se ne andò
echo 'Anna disse \"Ciao\" e se ne andò'; // stampa: Anna disse \"Ciao\" e se ne andò
echo "Anna disse "Ciao" e se ne andò"; // errore
?>
Da questi esempi si può capire che il backslash deve essere utilizzato come carattere di escape quando vogliamo includere nella stringa lo stesso tipo di carattere che la delimita; se mettiamo un backslash davanti ad un apice doppio in una stringa delimitata da apici singoli (o viceversa), anche il backslash entrerà a far parte della stringa stessa, come si vede nel terzo e nel settimo esempio. Il backslash viene usato anche come 'escape di sè stesso', nei casi in cui vogliamo esplicitamente includerlo nella stringa:
<?php
echo "Questo: \"\\\" è un backslash"; // stampa: Questo: "\" è un backslash
echo 'Questo: \'\\\' è un backslash'); // stampa: Questo: '\' è un backslash
echo "Questo: '\' è un backslash"); // stampa: Questo: '\' è un backslash
echo "Questo: '\\' è un backslash"); // stampa: Questo: '\' è un backslash
?>
Analizziamo il primo esempio: il primo backslash fa l'escape del primo paio di virgolette; il secondo backslash fa l'escape del terzo, che quindi viene incluso nella stringa; il quarto fa l'escape del secondo paio di virgolette. Il secondo esempio equivale al primo, con l'uso degli apici al posto delle virgolette. Negli ultimi due casi non è necessario fare l'escape del backslash, in quanto il backslash che vogliamo stampare non può essere scambiato per un carattere di escape (infatti vicino ad esso ci sono degli apici, che in una stringa delimitata da virgolette non hanno bisogno di escape). Di conseguenza, fare o non fare l'escape del backslash in questa situazione è la stessa cosa, e difatti i due esempi forniscono lo stesso risultato.
Passiamo ad esaminare l'ultimo modo di rappresentare le stringhe: la sintassi heredoc, poco utilizzata se non in situazioni nelle quali è necessario specificare stringhe molto lunghe. Questa ci consente di delimitare una stringa con i caratteri <<< seguiti da un identificatore (in genere si usa EOD, ma è solo una convenzione: è possibile utilizzare qualsiasi stringa composta di caratteri alfanumerici e underscore, di cui il primo carattere deve essere non numerico: la stessa regola dei nomi di variabile). Tutto ciò che segue questo delimitatore viene considerato parte della stringa, fino a quando non viene ripetuto l'identificatore seguito da un punto e virgola. Attenzione: l'identificatore di chiusura deve occupare una riga a sè stante, deve iniziare a colonna 1 e non deve contenere nessun altro carattere (nemmeno spazi vuoti) dopo il punto e virgola.
<?php
$nome = "Paolo";
$stringa = <<<EOD
Il mio nome è $nome
EOD;
echo $stringa;
?>
Questo codice stamperà 'Il mio nome è Paolo'. Infatti la sintassi heredoc risolve i nomi di variabile così come le virgolette. Rispetto a queste ultime, con questa sintassi abbiamo il vantaggio di poter includere delle virgolette nella stringa senza farne l'escape:
<?php
$frase = "ciao a tutti";
$stringa = <<<EOT
Il mio saluto è "$frase"
EOT;
echo $stringa;
?>
In questo caso stamperemo 'Il mio saluto è "ciao a tutti"'.
Array
Possiamo considerare un array come una variabile complessa, che contiene una serie di valori, ciascuno dei quali caratterizzato da una chiave, o indice che lo identifica univocamente. Facciamo un primo esempio, definendo un array composto di cinque valori:
$colori = array('bianco', 'nero', 'giallo', 'verde', 'rosso');
A questo punto ciascuno dei nostri cinque colori è caratterizzato da un indice numerico, che PHP assegna automaticamente a partire da 0. Per recuperare un determinato valore dalla variabile che contiene l'array, è sufficiente specificare il suo indice all'interno di parentesi quadre dietro al nome della variabile:
echo $colori[1]; // stampa 'nero'
echo $colori[4]; // stampa 'rosso'
Gli array verranno trattati in modo più approfondito nella prossima lezione.
Oggetto
Le classi e gli oggetti sono due degli argomenti sui quali gli sviluppatori di PHP hanno voluto puntare maggiormente nella nuova versione. L'argomento verrà trattato in modo approfondito nella Guida Teorica a PHP.
Espressioni e operatori aritmetici di PHP
Gli operatori sono un altro degli elementi di base di qualsiasi linguaggio di programmazione, in quanto ci consentono non solo di effettuare le tradizionali operazioni aritmetiche, ma più in generale di manipolare il contenuto delle nostre variabili. Il più classico e conosciuto degli operatori è quello di assegnazione:
Operatore di assegnazione
$nome = 'Giorgio';
Il simbolo '=' serve infatti ad assegnare alla variabile $nome il valore 'Giorgio'. In generale, possiamo dire che con l'operatore di assegnazione prendiamo ciò che sta alla destra del segno di ugualianza ('=') ed assegnamo lo stesso valore a ciò che sta a sinistra. Potremmo ad esempio assegnare ad una variabile il valore di un'altra variabile:
$a = 5;
$b = $a;
Con la prima istruzione assegnamo ad $a il valore 5, con la seconda assegnamo a $b lo stesso valore di $a.
Altri operatori molto facili da comprendere sono quelli che permettono di effettuare operazioni aritmetiche sui dati: addizione, sottrazione, divisione, moltiplicazione, modulo.
Operazioni aritmetiche
$a = 3 + 7; // addizione
$b = 5 - 2; // sottrazione
$c = 9 * 6; // moltiplicazione
$d = 8 / 2; // divisione
$e = 7 % 4; // modulo
// (il modulo è il resto della divisione intera, in questo caso 3)
Uno degli operatori più utilizzati è quello che serve per concatenare le stringhe: il punto.
Concatenare le stringhe
$nome = 'pippo';
$stringa1 = 'ciao ' . $nome; // $stringa1 vale 'ciao pippo'
Con l'operatore di assegnazione si può anche usare una variabile per effettuare un calcolo il cui risultato deve essere assegnato alla variabile stessa. Ad esempio, supponiamo di avere una variabile di cui vogliamo aumentare il valore:
$a = $a + 10; // il valore di $a aumenta di 10
Con questa istruzione, viene eseguito il calcolo che sta alla destra del segno '=' ed il risultato viene memorizzato nella variabile indicata a sinistra. Risulta chiaro che il valore della variabile $a prima dell'istruzione viene utilizzato per il calcolo, ma dopo che l'istruzione è stata eseguita viene utilizzata per memorizzare il risultato, quindi il suo valore cambia.
Un risultato di questo tipo si può ottenere anche con gli operatori di assegnazione combinati, che ci permettono di rendere il codice più compatto:
Operazioni di calcolo
$x += 4; // incrementa $x di 4 (equivale a $x = $x + 4)
$x -= 3; // decrementa $x di 3 (equivale a $x = $x - 3)
$x .= $a; // il valore della stringa $a viene concatenato a $x (equivale a $x = $x . $a)
$x /= 5; // equivale a $x = $x / 5
$x *= 4; // equivale a $x = $x * 4
$x %= 2; // equivale a $x = $x % 2
In questo modo diciamo a PHP che vogliamo assegnare alla variabile specificata a sinistra il risultato dell'operazione che si trova prima del simbolo uguale applicandola alla variabile stessa ed al valore specificato a destra. Più facile a farsi che a dirsi.
Nel caso fosse necessario incrementare e decrementare una variabile di una sola unità, ci vengono incontro gli operatori di incremento e decremento:
Incremento e decremento
$a++; ++$a; // incrementa di 1
$a--; --$a; // decrementa di 1
La differenza tra anteporre e posporre l'operatore di incremento o decremento è fondamentale nel momento in cui si utilizzando questi operatori all'interno di espressioni. Per ora vi basti sapere che anteporre l'operatore alla variabile dice al compilatore di incrementare la variabile e successivamente utilizzare il suo valore all'interno dell'espressione, mentre posporre l'operatore informa il compilatore che dovrà utilizzare nell'espressione il valore attuale e successivamente applicarvi l'incremento o il decremento.
Gli operatori logici e le espressioni booleane in php
Gli operatori di confronto sono fondamentali perchè ci permettono, effettuando dei confronti fra valori, di prendere delle decisioni, cioè di far svolgere al nostro script determinate operazioni invece di altre. Quando utilizziamo gli operatori di confronto, confrontiamo i due valori posti a sinistra e a destra dell'operatore stesso.
Dopo aver valutato un'espressione questo tipo, PHP arriva a valutare se essa è vera o falsa. Quindi il risultato sarà di tipo booleano (true o false).
Operazioni di confronto
Operatore Descrizione
== uguale
!= diverso
=== identico (cioè uguale e dello stesso tipo: ad esempio per due variabili di tipo intero)
> maggiore
>= maggiore o uguale
< minore
<= minore o uguale
Vediamo alcuni esempi:
$a = 7; $b = 7.0; $c = 4; //assegnamo valori a tre variabili
$a == $b; // vero
$a == $c; // falso
$a === $b; // falso, perchè $a è intero mentre $b è float
$a > $c; // vero
$c >= $a; // falso, $c è minore di $a
$a < $b; // falso, hanno lo stesso valore
$c <= $b; // vero
Una piccola osservazione sul terzo confronto: siccome abbiamo assegnato il valore di $b usando la notazione col punto decimale, per PHP $b è una variabile del tipo in virgola mobile, anche se in realtà il suo valore è intero. Per questo il confronto di identità restituisce falso.
Fino a qui abbiamo visto comunque casi molto semplici perchè tutte le variabili avevano valori numerici. Gli stessi confronti però si possono fare anche con altri tipi di variabili, ed in particolare con le stringhe. In questo caso il confronto viene fatto basandosi sull'ordine alfabetico dei caratteri: vale a dire che vengono considerati 'minori' i caratteri che 'vengono prima' nell'ordine alfabetico. Quindi 'a' è minore di 'b', 'b' è minore di 'c', eccetera. Inoltre tutte le lettere minuscole sono 'maggiori' delle lettere maiuscole, e tutte, maiuscole e minuscole, sono 'maggiori' delle cifre da 0 a 9:
$a = 'Mario'; $b = 'Giorgio'; $c = 'Giovanni'; $d = 'antonio'; $e = '4 gatti';
$a < $b; // falso, la 'G' precede la 'M'
$b < $c; // vero, la 'r' ('Gior') precede la 'v' ('Giov')
$d > $a; // vero, la 'a' minuscola è 'maggiore' di qualsiasi lettera maiuscola
$c > $e; // vero, ogni lettera è 'maggiore' di qualsiasi cifra
Dato che PHP è un linguaggio con una tipizzazione debole permette di confrontare tra loro variabili contenenti tipi di dato differenti cercando di trasformare le variabili in valori confrontabili. Se per esempio effettuassimo un confronto (==) tra una variabile contenente l'intero uno (1) ed una contenente la stringa uno ('1') otterremmo un valore di verità dato che PHP trasformerebbe entrambi i valori in numeri in modo che siano confrontabili. Per assegnare questo valore numerico, PHP controlla se all'inizio della stringa ci sono dei numeri: se ne trova, considererà tutti i numeri che trova inizialmente come il valore numerico di quella stringa. Se non ne trova, il valore della stringa sarà 0:
$a = 7; $b = 5; $c='molte persone'; $d='7 persone'; $e='5';
$a == $d; // vero, $d vale 7
$a === $d; // falso, valgono entrambi 7 ma $a è un intero mentre $d è una stringa
$b > $c; // vero, $b vale 5 mentre $c vale 0
$e > $c; // falso: questo è un confronto fra due stringhe, quindi valgono le regole viste prima
Prestiamo attenzione all'ultimo esempio: il valore di $e era stato assegnato usando gli apici, e questo fa sì che PHP lo consideri una stringa anche se il contenuto è un numero.
Il confronto fra un numero e una stringa può avvenire in maniera voluta, ma è più probabile che avvenga per caso, quando cioè una variabile che pensavamo contenesse un numero contiene in realtà una stringa. È evidente che in questo caso potremo facilmente ottenere un risultato diverso da quello che ci aspettavamo, o, viceversa, potremmo ottenere casualmente il risultato atteso: in quest'ultima situazione è possibile che risultati inaspettati arrivino più avanti nello script, se utilizzeremo di nuovo la stessa variabile.
In tutte queste situazioni, tener presente il modo in cui PHP tratta questi confronti può essere di aiuto per spiegarci comportamenti apparentemente bizzarri del nostro script. È comunque buona norma assicurarsi che due espressioni restituiscano risultati dello stesso tipo quando si effettuano confronti, oppure utilizzare gli operatori === e !== che tengono conto anche del tipo di dato utilizzato.
Gli operatori logici
Con gli operatori logici possiamo combinare più valori booleani, oppure negarne uno (nel caso di NOT). Questi valori sono:
Operatore Descrizione
Or o || valuta se almeno uno dei due operatori è vero; si può indicare con ' Or oppure col "doppio pipe" (||)
And o && valuta se entrambi gli operatori sono veri; si indica con And o con la doppia "e commerciale" (&&)
Xor viene chiamato anche 'or esclusivo', e valuta se uno solo dei due operatori è vero: l'altro deve essere falso; si indica con Xor
! è l'operatore 'not' e vale come negazione. Si usa con un solo operatore: è vero quando l'operatore è falso, e viceversa; si indica con il punto esclamativo (!)
Anche in questa occasione vediamo qualche esempio:
10 > 8 And 7 < 6; // falso, perchè la prima condizione è vera ma la seconda è falsa
10 > 8 Or 7 < 6; // vero
9 > 5 And 5 == 5; // vero, entrambe le condizioni sono vere
9 > 5 Xor 5 == 5; // falso, solo una delle due deve essere vera perchè si verifichi lo 'Xor'
4 < 3 || 7 > 9; // falso, nessuna delle due condizioni è vera
6 == 6 && 1 > 4; // falso, solo la prima condizione è vera
Per quanto riguarda gli operatori 'and' e 'or', le due diverse notazioni differiscono per il livello di precedenza in caso di espressioni complesse. Infatti, siccome è possibile combinare molti operatori in espressioni anche assai complicate, è necessario sapere con quale ordine PHP valuta i diversi operatori. Queste regole ricalcano le regole algebriche in base alle quali moltiplicazioni e divisioni hanno la precedenza su addizioni e sottrazioni, ma sono più complesse perchè devono considerare anche gli altri operatori. Vediamo quindi qual è l'ordine di priorità dei diversi operatori, iniziando da quelli che hanno la priorità maggiore:
Operatori di incremento e decremento (++ --)
Moltiplicazione, divisione, modulo (* / %)
Addizione e sottrazione (+ -)
Operatori di confronto per minore e maggiore (< <= => >)
Operatori di confronto per uguaglianza e disuguaglianza (== === !=)
Operatore logico 'and', nella notazione col simbolo (&&)
Operatore logico 'or', nella notazione col simbolo (||)
Operatori di assegnazione, compresi quelli 'sintetici' (= += -= /= *= %= .=)
Operatore logico 'and', nella notazione letterale (And)
Operatore logico 'xor' (Xor)
Operatore logico 'or', nella notazione letterale (Or)
Abbiamo già visto prima, in occasione degli esempi sugli operatori logici, l'applicazione di questi principi di precedenza: infatti in tutte quelle espressioni venivano valutati prima gli operatori di confronto e, solo dopo, quelli logici. Un'altra classica rappresentazione di esempio è quella dell'espressione algebrica:
5 + 4 * 2; // questa espressione vale 13 e non 18,
// perché la moltiplicazione viene eseguita prima
(5 + 4) * 2; // questa invece vale 18, perché le parentesi modificano
// l'ordine di esecuzione
Come abbiamo visto, così come avviene in algebra, usando le parentesi possiamo determinare a nostro piacere quali operatori devono essere valutati per primi. Per questo motivo, sebbene sia possibile imparare a memoria l'ordine di precedenza che abbiamo visto poco fa, il nostro consiglio è quello di non tenerne conto, e di utilizzare sempre le parentesi quando abbiamo bisogno di costruire un'espressione un po' complessa: in questo modo ridurremo il rischio di errori, e soprattutto renderemo il nostro codice molto più leggibile. Infatti leggere un'espressione regolata dalle parentesi è molto più immediato che non doversi ricordare quali degli operatori hanno la precedenza sugli altri.
Le espressioni
Dopo questa breve introduzione sugli operatori, possiamo definire un'espressione come una qualsiasi combinazione di funzioni (v. lezioni successive), valori e operatori che si risolvono in un valore. Nel caso visto prima, l'espressione 7+3 ha come valore 10.
In generale, in PHP, qualsiasi cosa utilizzabile come un valore può essere considerata un'espressione. Vediamo alcuni rapidi esempi:
15 * 3; // espressione il cui valore è 45
'Giacomo' . ' Verdi'; // espressione il cui valore è 'Giacomo Verdi'
$a + $b; // espressione il cui valore è dato dalla somma
// dei valori delle variabili $a e $b
Come possiamo vedere, quindi, la presenza di operatori fa sì che il valore dell'espressione risulti diverso da quello dei singoli valori che fanno parte dell'espressione stessa. Vediamo un caso particolare, quello dell'operatore di assegnazione:
$a = 6; // il valore di questa espressione è 6
Quando usiamo una espressione per assegnare un valore ad una variabile, il valore che tale espressione assume è uguale a quello che si trova a destra dell'operatore di assegnazione (che è anche quello che viene assegnato all'operatore di sinistra). Questo significa che noi possiamo scrivere
echo 'Paolo'; // stampa 'Paolo'
echo ($nome = 'Paolo'); // stampa sempre 'Paolo'
Le due espressioni hanno infatti lo stesso valore, cioè 'Paolo'. Quindi con le due istruzioni viste sopra otteniamo sul browser lo stesso risultato. La differenza, ovviamente, è che con la seconda, oltre a stampare il valore a video, abbiamo anche assegnato lo stesso valore alla variabile $nome.
Vediamo qualche altro esempio:
7 > 4; //valore dell'espressione: true (vero)
$a = 7 > 4; //valore dell'espressione: lo stesso di prima;
//la variabile $a assume quindi il valore true
$b = 5 * 4; //valore dell'espressione: 20; viene assegnato a $b
Precedentemente avevamo accennato ad una differenza nella valutazione dell'espressione fra i diversi modi di utilizzare gli operatori di incremento e di decremento. Vediamo ora di approfondire questo concetto:
$a = 10;
$b = 10;
++$a; // incrementiamo $a, che diventa 11; l'espressione vale 11
$b++; // anche $b diventa 11; qui però l'espressione vale 10
La differenza è questa: se usiamo l'operatore di incremento (o di decremento) prima della variabile, l'espressione assume il nuovo valore della variabile stessa. Se invece lo mettiamo dopo, l'espressione prenderà il valore che la variabile aveva prima dell'operazione. Di conseguenza:
$a = 5;
$b = 5;
echo ++$a; // $a diventa 6, e viene stampato '6'
echo $b++; // anche $b diventa 6, ma viene stampato '5'
echo ++$b; // a questo punto $b è diventato 7, e viene stampato '7'
Istruzione If
Con le strutture di controllo andiamo ad analizzare un altro degli aspetti fondamentali della programmazione: la possibilità cioè di eseguire operazioni diverse, ed eventualmente di eseguirle più volte, in base alla valutazione di determinate condizioni. In questa lezione esamineremo le istruzioni che ci permettono di eseguire o non eseguire certe porzioni di codice.
If
La principale di queste istruzioni è la if, la cui sintassi più elementare è la seguente:
if( <condizione> ) {
<codice>
}
Dopo l'if, deve essere indicata fra parentesi un'espressione da valutare (condizione). Questa espressione verrà valutata in senso booleano, cioè il suo valore sarà considerato vero o falso. Nel caso in cui l'espressione non abbia un valore booleano, PHP convertirà comunque questo valore in booleano utilizzando precise regole che vedremo tra qualche riga. Dunque, se la condizione è vera, l'istruzione successiva viene eseguita. In caso contrario, viene ignorata. Potremmo anche avere la necessità di eseguire, nel caso in cui la condizione sia vera, non una sola ma più istruzioni. Questo è perfettamente possibile, ma dobbiamo ricordarci di comprendere questo blocco di istruzioni fra due parentesi graffe, ad esempio così:
// ....
if ($nome == 'Luca') {
echo "ciao Luca!<br>";
echo "dove sono i tuoi amici?<br>";
}
echo "ciao a tutti voi";
In questo modo, se la variabile $nome ha effettivamente il valore 'Luca' vengono eseguite le due istruzioni successive, comprese fra le parentesi graffe. Dopo avere valutato la condizione ed eventualmente eseguito le due istruzioni previste, lo script proseguirà con ciò che sta fuori dalle parentesi graffe. Quindi nel nostro esempio la frase "ciao a tutti voi" viene prodotta in ogni caso. È buona norma usare comunque le parentesi graffe per delimitare il codice condizionato, anche quando è costituito da una sola istruzione: infatti questo rende il codice più leggibile, ed inoltre potrebbe evitarci degli errori se ci dovesse capitare di voler aggiungere delle istruzioni al blocco condizionato dimenticando di aggiungere le graffe.
Dobbiamo notare un particolare, riguardo alla sintassi di questa istruzione: per la prima volta, vediamo che in questo costrutto mancano i punto e virgola. Infatti la if e la condizione espressa fra parentesi non devono averli; continuiamo invece a metterli nel blocco di codice condizionato.
Abbiamo detto poco fa che la condizione espressa fra parentesi potrebbe non avere un valore booleano. PHP però è in grado di considerare booleano qualsiasi valore, in base ad alcune regole molto semplici. Facciamo un altro esempio banale:
if (5) {
print "ciao Luca!";
}
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à sempre stampata. Questo perchè, per PHP, il valore 5, così come qualsiasi numero diverso da 0, è considerato 'vero'. In sostanza, PHP considera come falsi:
il valore numerico 0, 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. Quindi anche la banale espressione che abbiamo utilizzato nell'esempio di prima.
Analizziamo ora un caso che spesso crea problemi se non viene compreso fin dalle prime battute. Vediamo questo codice
$a = 7;
if ($a = 4)
echo '$a è uguale a 4!';
A prima vista, qualcuno potrebbe essere ingannato da queste istruzioni, soprattutto chi ha precedenti esperienze di programmazione in linguaggi strutturati diversamente, nei quali un'espressione come $a = 4 potrebbe essere sia un'assegnazione che un test. Costoro infatti si aspetteranno che questo blocco di codice non stampi niente, e rimarrebbero molto sorpresi, qualora lo provassero, di vedere invece sul browser la frase '$a è uguale a 4'.
Questo succederebbe perchè l'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 è un valore vero. Se invece che 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, quando vogliamo verificare se il valore di una variabile è uguale a qualcosa, di utilizzare l'operatore condizionale di uguaglianza, cioè il doppio uguale ("=="). In caso contrario, non solo otterremo molto spesso risultati diversi da quelli che ci saremmo aspettati, ma avremo anche modificato il valore di una variabile che volevamo soltanto verificare.
Istruzioni Else e Eseif
Else
Andiamo ora un po' più a fondo nell'analisi dell'istruzione if: essa infatti ci permette non solo di indicare quali istruzioni vogliamo eseguire se la condizione è vera, ma anche di esprimere un blocco di codice da eseguire quando la condizione è falsa. Ecco come:
If (<condizione>) {
<codice>
} else {
<codice>
}
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' viene ignorato quando la condizione è vera, mentre viene eseguito se la condizione è falsa.
Le istruzioni if possono essere nidificate una dentro l'altra, consentendoci così di creare codice di una certa complessità. Esempio:
if ($nome == 'Luca') {
if ($cognome == 'Rossi') {
print "Luca Rossi è di nuovo fra noi";
} else {
print "Abbiamo un nuovo Luca!";
}
} else {
print "ciao $nome!";
}
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 questa 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 è falsa.
if ($nome == 'Luca') {
print "bentornato Luca!";
} elseif ($cognome == 'Verdi') {
print "Buongiorno, signor Verdi";
} else {
print "ciao $nome!";
}
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 saltati.
Istruzione Switch e operatore terniario
Switch
Passiamo ora a verificare una seconda istruzione che ci permette di prevedere diversi valori possibili per un'espressione ed eseguire codice specifico in base al valore:
switch (<condizione>) {
case <valore 1>:
<codice>
break;
case <valore 1>:
<codice>
break;
....
default:
<codice>;
break;
}
L'istruzione switch prevede che indichiamo, fra parentesi, un'espressione che verrà valutata per il suo valore (questa volta non si tratta necessariamente di un valore booleano). Di seguito, tra parentesi graffe, esprimeremo una serie di espressioni da confrontare con quella indicata prima: dal momento in cui ne trova una il cui valore è uguale, PHP esegue il codice indicato di seguito, fino a quando non incontra un'istruzione break. Come possiamo vedere dall'esempio, le espressioni da confrontare con la prima vengono precedute dalla parola chiave case e seguite dai due punti. L'istruzione default può essere indicata come 'ultimo caso', che si considera verificato quando nessuno dei casi precedenti è risultato vero. L'indicazione default può anche essere assente.
È molto importante comprendere la funzione dell'istruzione break in questa situazione: infatti, quando PHP verifica uno dei casi, esegue non solo il codice che trova subito dopo, ma anche tutto quello che trova di seguito, compreso quello relativo ai casi seguenti. Questo fino a quando non trova, appunto, un'istruzione break. Se non mettessimo un'istruzione break alla fine di un blocco di codice relativo ad un caso particolare, l'esecuzione continuerebbe eseguendo anche il case successivo. Questo comportamento ci permette però di prevedere un unico comportamento per più valori dell'espressione sotto esame:
switch ($nome) {
case 'Luca':
case 'Giorgio':
case 'Franco':
print "Ciao, vecchio amico!";
break;
case 'Mario':
print "Ciao, Mario!";
break;
case 'Paolo':
print "Finalmente, Paolo!";
break;
default:
print "Benvenuto, chiunque tu sia";
}
In questo caso, abbiamo previsto un unico messaggio per il caso in cui la variabile $nome valga 'Luca', 'Giorgio' o 'Franco'.
L'operatore ternario
L'operatore ternario è 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 una if.
($altezza >= 180) ? 'alto' : 'normale' ;
Questa espressione prenderà il valore 'alto' se la variabile $altezza è maggiore o uguale a 180, e 'normale' nel caso opposto. Come vediamo, 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:
$tipologia = ($altezza >= 180) ? 'alto' : 'normale';
equivale a scrivere
if ($altezza >= 180) $tipologia = 'alto' ;
else
$tipologia = 'normale';
Come potete vedere, in termini di spazio il risparmio è abbastanza significativo. Bisogna però stare attenti ad abusare di questa forma, perchè a volte può rendere più difficoltosa la leggibilità del nostro script, anche se risulta di indubbia utilità nel caso in cui si necessiti rendere più compatto il codice.
I cicli:for, while e do
I cicli sono un altro degli elementi fondamentali di qualsiasi linguaggio di programmazione, in quanto ci permettono di eseguire determinate operazioni in maniera ripetitiva. È una necessità che si presenta molto spesso: infatti non è raro che un programma o uno script debbano elaborare quantità anche molto grosse di dati; in questa situazione, si prevederà il trattamento da utilizzare per ogni singolo dato (o gruppo di dati correlati), che sarà poi ripetuto per tutte le ricorrenze di tali dati.
Ciclo For
Iniziamo subito con un esempio (come al solito abbastanza banale): supponiamo di voler mostrare i multipli da 1 a 10 di un numero, ad esempio 5. La prima soluzione è quella di usare il 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 seguito, 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 risulta falsa, l'esecuzione del ciclo viene interrotta, ed il controllo passa alle istruzioni 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 abbiamo visto sopra, 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.
Con il ciclo for, così come con tutti gli altri cicli, è molto importante stare attenti a non creare una situazione in cui il ciclo non raggiunge mai una via d'uscita (il cosiddetto 'loop'): in questo caso, infatti, lo script rieseguirebbe il nostro ciclo all'infinito. Nel nostro esempio di prima potrebbe succedere, ad esempio, se sbagliassimo a scrivere 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 questo modo $mul rimarrebbe sempre uguale ad 1, ed il nostro ciclo stamperebbe all'infinito "5 * 1 = 5", perchè $mul non diventerebbe mai maggiore di 10.
In molte situazioni classiche di programmazione, un errore di questo genere potrebbe costringerci a forzare la chiusura del programma o addirittura a spegnere la macchina: nel caso di PHP, questo di solito non succede, in quanto gli script PHP hanno un limite di tempo per la loro esecuzione, oltre il quale si arrestano. Tale limite è normalmente di 30 secondi, ed è 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 specie 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 con un esempio come ottenere 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 ci 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, comunque, il concetto fondamentale è che l'esecuzione del ciclo termina quando la condizione fra parentesi non è più verificata: ancora una volta, quindi, è possibile che il ciclo non sia eseguito mai, nel caso in cui la condizione risulti falsa fin da subito.
Il ciclo do...while
Esiste invece 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 del nostro esempio, 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".
Uscire da un ciclo
Abbiamo visto che PHP termina l'esecuzione di un ciclo quando la condizione a cui è sottoposto non è più verificata. Abbiamo però a disposizione altri strumenti per modificare il comportamento del nostro script dall'interno del ciclo: infatti possiamo dire a PHP di non completare la presente iterazione e passare alla successiva (con continue) oppure di interrompere definitivamente l'esecuzione del ciclo (con break). Vediamo un esempio:
for ($ind = 1; $ind < 500; $ind++) {
if ($ind % 100 == 0) {
break;
}elseif ($ind % 25 == 0) {
continue;
}
echo "valore: $ind <br/>";
}
Questo codice imposta un ciclo per essere eseguito 500 volte, con valori di $ind che vanno da 1 a 500. In realtà, le istruzioni che abbiamo posto al suo interno fanno sì che la stampa del valore di $ind non venga eseguita ogni volta che $ind corrisponde ad un multiplo di 25 (infatti l'istruzione 'continue' fa sì che PHP salti la 'print' e passi direttamente all'iterazione successiva, incrementando la variabile), e che il ciclo si interrompa del tutto quando $ind raggiunge il valore 100.
Ciclo Foreach
Esiste un ultimo tipo di ciclo, ed è un ciclo particolare perchè è costruito appositamente per il trattamento degli array e di particolari oggetti chiamati Iteratori: si tratta del foreach. Questo ci permette di costruire un ciclo che viene ripetuto per ogni elemento di una collezione passata come argomento. La sintassi è la seguente:
foreach ($arr as $chiave => $valore) {
<codice>
}
All'interno delle parentesi graffe avremo a disposizione, nelle due variabili che abbiamo definito $chiave e $valore, l'indice e il contenuto dell'elemento che stiamo trattando. È da notare che, nel caso ci interessi soltanto il valore e non la chiave (ad esempio perchè le chiavi sono numeriche), possiamo anche evitare di estrarre la chiave stessa:
foreach ($arr as $valore) {
<codice>
}
fonte:italian web side