Quasi la totalità dei programmi ha la necessità di svolgere alcune istruzioni o compiere determinate operazioni (oppure evitare di compiere alcune operazioni) a seconda dei dati di partenza. Per esempio un programma che esegue una divisione tra due numeri a / b dovrà evitare di compiere l'effettiva operazione aritmetica se il dato b = 0.
Per questo in tutti i linguaggi di programmazione esistono dei particolari costrutti che generalmente permettono di:
- Scegliere se eseguire o meno una certa porzione di codice, oppure
- Eseguire più volte una certa parte di codice.
Dal punto di vista implementativo queste modifiche al normale flusso del programma si realizzano con determinate parole chiave:
IF ELSE
if ( condizione )
{
//operazioni da eseguire se la condizione è verificata
}
else
{
//operazioni da eseguire se la condizione non è verificata
}
IF
if ( condizione )
{
//operazioni da eseguire se la condizione è verificata
}
//altre operazioni del programma
DO WHILE
do {
//istruzioni del ciclo
} while ( condizione ) ;
WHILE
while ( condizione )
{
//istruzioni del ciclo
}
FOR
for (assegnamento; condizione; incremento o decremento)
{
// istruzioni del ciclo
}
FOREACH
foreach (array_expression as $valore)
{
// istruzioni del ciclo
}
CONDIZIONE
Per condizione s'intende ogni operazione aritmetico-logica che dia come risultato il valore true
oppure il valore false
. Per esempio:
$primoDato>0
$secondoDato<=3
($terzoDato>5 && $terzoDato<100) || ($secondoDato!=0 && $primoDato==2)
Nonostante questo nel PHP, come in altri linguaggi ad alto livello esistono dei valori che pur non essendo di tipo booleano vengono considerati tali (*) ad esempio:
- valore nullo, NULL = false , 0 = false.
- valore non nullo, ! NULL = true , 1 = true.
per esempio la condizione seguente ha come valore true se la variabile a è diversa da 1 e la funzione Log(a) non produce errori (*):
- a!=1 && Log(a)
(*) Solitamente, quando viene implementata una funzione (la maggior parte delle funzioni già presenti nel linguaggio o nelle librerie pubbliche e non solo per quanto riguarda il PHP), si cerca di prevedere che nel caso di dati di input errati o impossibilità di eseguire le operazioni per svariati motivi, la funzione abbia come valore di ritorno false
in modo che nel flusso principale si possa oltre che lanciare la funzione controllare anche che questa sia effettivamente stata eseguita correttamente. Per esempio se avessimo una funzione Dividi(a,b)
che esegue l'operazione a/b potremmo controllare il flusso principale nel seguente modo:
if ( ! $c = Dividi ( $a , $b ) )
{
print("Errore nei dati. Impossibile eseguire la divisione.");
}
else
{
print("Il risultato della divisione è $c.");
}
Ora, chiarito il termine condizione si può vedere un costrutto di esempio che permette di eseguire una certa parte di codice (quella interna al blocco dell'if) se la condizione di controllo (quella interna alle parentesi) è verificata. Se la condizione non è verificata viene saltato per intero il blocco interno dell'if e il programma prosegue partendo dall'else.
E' possibile far seguire all'else un ulteriore if senza che sia presente il blocco d'istruzioni dell'else, quindi:
IF ElSE:
if ( condizione1 )
{
// operazioni da eseguire se la condizione è verificata
}
else
if ( condizione2 )
{
// operazioni da eseguire se la condizione2 è verificata
}
else
if ( condizione3 )
{
// operazioni da eseguire se la condizione3 è verificata
}
// altre operazioni del flusso principale
In questo caso se la condizione1 è verificata si eseguono le operazioni del primo if e si saltano tutti gli altri if seguiti agli else accodati, quindi condizione2 e condizione3 non vengono neanche valutate. Questo tipo di costrutto opera in modo praticamente identico al costrutto switch-case.
if è il costrutto più importante nei linguaggi di programmazione. Permette di eseguire una certa operazione solo se si verifica una certa condizione.
if (condizione)
{ operazione }
L'operazione può anche non essere racchiusa tra parentesi graffe.
Vediamo un semplice esempio.
if ($a==5) {
echo "La variabile a vale 5";
}
In questo caso verrà stampata la stringa "La variabile a vale 5" solo quando $a sarà uguale a 5.
Consideriamo due variabili a e b e confrontiamole per stabilire quale sia la maggiore.
if ($a>$b)
{ echo "a è maggiore di b"; }
if ($b>$a)
{ echo "b è maggiore di a"; }
Il primo if controlla se a è maggiore di b: se risulta vero verrà stampata la stringa "a è maggiore di b". Nel caso contrario il flusso passa al secondo ciclo: se questo è vero allora stampa la stringa "b è maggiore di a". Nel caso in cui anche il secondo if risultasse falso non viene stampato niente e si prosegue nell'operazione successiva.
La stessa cosa si poteva anche risolvere in maniera più brillante:
if ($a>$b)
{ echo "a è maggiore di b"; }
else
{ echo "b è maggiore di a"; }
Abbiamo introdotto il controllore else: aggiunge la possibilità di eseguire un'istruzione alternativa nel caso la condizione non sia vera.
if (condizione)
{ operazione1 }
else
{ operazione2 }
Vediamo ora di applicare tutti i casi finora visti, utilizzando l'annidamento di più if: l'importante è ricordarsi di chiudere sempre una condizione che si è aperta.
if ($a>$b)
{ echo "a è maggiore di b"; }
else
{ if ($a<$b) { echo "a è minore di b"; }
else
{ if ($a == $b) { echo "a è uguale di b"; }
}}
switch può essere paragonato a più if con la stessa condizione: in pratica la stessa variabile viene confrontata con più valori e quando trova quello corrispondente esegue l'operazione.
switch (variabile) {
case condizione:
operazione
break;
}
Una volta che la variabile corrisponderà al valore della condizione il ciclo verrà interrotto utilizzando il controllore break. Vediamo un esempio:
switch ($mese) {
case 1:
echo "Siamo a Gennaio";
break;
case 2:
echo "Siamo a Febbraio";
break;
case 3:
echo "Siamo a Marzo";
break;
}
Viene analizzata la variabile $mese: nel caso sia uguale a 1 viene stampato "Siamo a Gennaio", nel caso sia uguale a 2 viene stampato "Siamo a Febbraio", etc.
Vediamo come si sarebbe povuto affrontare lo stesso problema utilizzando if al posto di switch:
if ($mese == 1) {
echo "Siamo a Gennaio";
}
if ($mese == 2) {
echo "Siamo a Febbraio";
}
if ($mese == 3) {
echo "Siamo a Marzo";
}
Quando la variabile non è uguale a nessuna condizione, si può utilizzare il blocco speciale default. Vediamo come:
switch ($mese) {
case 1:
echo "Siamo a Gennaio";
break;
default:
echo "Non siamo in Gennaio";
}
Viene analizzata la variabile $mese: nel caso sia uguale a 1 viene stampato "Siamo a Gennaio", in tutti gli altri casi viene stampato "Non siamo in Gennaio".
while è il ciclo più semplice del linguaggio php.
Permette di ripetere un'operazione fino a quando non si verifica la condizione iniziale.
while (espressione)
{ istruzione }
Vediamo un semplice esempio:
$i=1;
while ($i <= 10)
{
echo $i;
$i++;
}
Questo ciclo continua ad incrementare la variabile $i fino a quando non sarà uguale a 10 ed ogni volta stampa il suo valore. In pratica verrà stampata la stringa "1 2 3 4 5 6 7 8 9 10".
Un modo alternativo per eseguire la stessa cosa sarà ricorrere al ciclo do..while. L'unica differenza è che il valore della condizione viene controllato alla fine del ciclo e non all'inizio. In pratica la prima operazione viene sempre eseguita, sia che la condizione sia vera o falsa.
do
{
operazione
}
while ( condizione )
Vediamo l'esempio:
$i=1;
do
{
echo $i;
$i++;
}
while ($i <= 10)
for è un altro ciclo utilizzabile all'interno di php.
for (condizione_iniziale ; condizione_finale ; incremento)
{ operazione }
All'inizio viene valutata la condizione iniziale (solo la prima volta) e quella finale: se corrispondono allora si esce dal ciclo, altrimenti si incrementa la condizione iniziale di quanto stabilito.
Vediamo un esempio:
for ($i = 1; $i <= 10; $i++)
{ echo $i; }
Alla fine del ciclo verrà stampata la stringa "1 2 3 4 5 6 7 8 9 10".
Se non viene inserito la condizione finale, il ciclo continuerà all'infinito a meno che non si inserisca la clausola break.
for ($i = 1; $i++)
{
if ($i == '10') {
break;
echo $i;
}
}
In questo caso si parte dalla variabile $i che vale 1 e la si incrementa di un'unità per volta. Il ciclo si interrompe quando $i sarà uguale a 10 e ne stampa il valore.
Semplice costrutto per lo scorrimento di un array, vediamo come usarlo:
La sintassi e':
foreach (array_expression as $chiave => valore)
{
//operazioni...
}
In moltissimi casi si ha la necessita' di scorrere un array indipendentemente dal conoscere o meno le chiavi. Questo controllo di flusso e' appositamente creato per questo tipo di dato, infatti restituisce un errore se 'array_expression' e' una variabile (inizializzata o nulla), un oggetto, ecc.
Supponiamo di avere un array cosi' costruito:
$myArray = array(
'primo' => "valore 1",
'secondo' => "valore 2",
3 => "valore 3"
);
Ci sono 2 varianti del costrutto:
-Con chiave: le operazioni all'interno del ciclo venono ripetute per ogni chiave. Ad ogni ciclo viene assegnato alla variabile $chiave la chiave successiva presente nell'array (quindi al primo ciclo conterra' "primo", al secondo ciclo conterra' "secondo" mentre al terzo conterra' "3"). Alla variabile $valore verra' assegnato il appunto valore della chiave rispetto all'array (quindi al primo ciclo "valore 1", nel secondo "valore 2", nel terzo "valore 3")
foreach ($myArray as $chiave => $valore)
{
//operazioni...sono visibili le variabili $chiave e $valore
}
-Senza chiave: il ciclo funziona esattamente come il precedente ma non viene indicata una variabile a cui assegnare la chiave (quindi non e' visibile nel ciclo).
foreach ($myArray as $chiave => $valore)
{
//operazioni...e' visibile unicamente la variabile $valore
}