Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Corso base di Php - Lezione 4
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet
Precedente :: Successivo  
Autore Messaggio
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 01 Feb 2009 21:05    Oggetto: Corso base di Php - Lezione 4 Rispondi

Dopo molto tempo zeussino e io abbiamo deciso di riprendere il corso di php.
Per vari motivi si è optato per continuare il corso sul forum, così come era nato.
Per le tre lezioni precedenti rimando agli articoli pubblicati tempo fa:
Lezione 1
Lezione 2
Lezione 3
Ribadisco qui che qualora aveste richieste fatele pure, inoltre vi chiedo di perdonare la mia troppa "teoricità"; purtroppo non sono un grande oratore, all'inizio il corso era stato impostato in modo da portare la gente ad avere nel minor tempo possibile le nozioni base per poi metterle insieme in situazioni più o meno concrete.
Per cui se così com'è il corso non va bene perchè troppo "criptico" ditelo, chiedete e vedrò di far tutto ciò che in mio potere per migliorare la cosa.
Ecco a voi la quarta lezione:

Costrutti condizionali
E' norma che in un programma capiti di dover gestire delle condizioni sulle variabili e php mette a disposione il classico costrutto if(...) per fare questo.
Il piccolo esempio qui sotto fa si che se la variabile $a contiene il valore 5 venga stampato un messaggio in grassetto.
Codice:

<html>
   <head>
      <title>Prova if</title>
   </head>
   <body>
      Questo script mostra l'uso pi&ugrave; semplice di if...<br/>
   <?php
      $a=3;
      
      if ($a==5)
         print '<strong>La variabile vale 5!</strong>';
   ?>
   </body>
</html>

Solo impostando a 5 la variabile verrà stampato il messaggio in grassetto.
La forma generale del costrutto base è:
Codice:

if(condizione)
{
   ...
}

dove "condizione" è una serie più o meno complessa di controlli su una o più variabili. Nel caso nella if ci sia solo un'istruzione potremmo omettere le graffe come ho fatto io nell'esempio.

Nell'esempio di prima abbiamo visto come si verifica che una variabile contenga un determinato valore e per farlo abbiamo usato l'operatore di confronto "==".
Vorrei che facciate subito attenzione ad una cosa: uno degli errori più frequenti e anche più difficili da scovare è scrivere la seguente condizione al posto della precedente:
Codice:

<html>
   <head>
      <title>Prova if</title>
   </head>
   <body>
      Questo script mostra l'uso pi&ugrave; semplice di if...<br/>
   <?php
      $a=3;
      
      if ($a=5)
         print '<strong>La variabile vale 5!</strong>';
   ?>
   </body>
</html>

Cosa cambia? Nella if abbiamo scritto "=" invece di "==" e ciò porta lo script ad entrare sempre nella if e quindi indipendentemente da quanto vale $a verrà sempre stampata la scritta in grassetto.
Questo porta anche ad una coseguenza più grave, ossia, nel caso $a venisse usata successivamente alla if il suo valore sarebbe a quel punto 5!.
L'interprete non segnalerà che al posto di "==" in una if abbiamo scritto "=" perchè per php questa è una cosa valida (e più avanti vedremo anche che sarà in alcuni casi utile).
Per php qualunque cosa diversa da 0 o da una stringa vuota vale "true" e in caso contrario "false".
Le condizioni seguenti sono equivalenti:
Codice:

<?
   $a=1;
   if ($a)
   {
      print 'ciao';
   }
   print '<br/>';
   if ($a==1)
   {
      print 'ciao';
   }
?>

e la prima if valuta come vera la condizione.
Inoltre "=" mantiene il suo scopo dentro ad una condizione percui l'esempio errato equivale a:
Codice:

<html>
   <head>
      <title>Prova if</title>
   </head>
   <body>
      Questo script mostra l'uso pi&ugrave; semplice di if...<br/>
   <?php
      $a=3;
      
      if (($a=5)!=0)
         print '<strong>La variabile vale 5!</strong>';
   ?>
   </body>
</html>

in cui la condizione sarà sempre verà perchè l'"=" assegna ad $a il valore 5 e questo verrà confrontato con 0 tramite "!=" che verifica la diversità tra due valori: 5 è sempre diverso da 0 quindi (5!=0) sarà sempre vera e noi entreremo sempre nella if.
In mezzo a tante righe di codice è difficile trovare "=" al posto di "==" e questo implica una difficile soluzione al bug a cui andremo sicuramente in contro.

Oltre a confrontare l'uguaglianza e la diversità tra due valori possiamo anche tramite ">" e "<" verificare se uno è maggiore o minore dell'altro e con ">=" e "<=" verificare le disuguaglianze larghe (in cui può valere l'uguale).
Normalmente può capitare di dover eseguire delle operazioni in caso una condizione sia vera e di doverne fare altre in caso contrario; tramite il costrutto
Codice:

if(condizione)
{
   ...   
}
else
{
   ...
}

possiamo risolvere il problema.
Il seguente script stampa due frasi diverse a seconda che $a sia o no uguale a 0.
Codice:

<?
   $a=2;
   
   if ($a==0)   // equivale a !$a, ossia $a non è true
   {
      print 'Dentro all\'if...';
   }
   else
   {
      print 'Dentro all\'else';
   }
?>

oppure il successivo discrimina il fatto che $a sia maggiore di 43
Codice:

<?
   $a=46;
   
   if ($a>43)   
   {
      print 'Dentro all\'if...';
   }
   else
   {
      print 'Dentro all\'else';
   }
?>

Ricordate che l'else agisce sull'ultima if e che possiamo anche avere più alternative alla prima condizione. Il costrutto più generico possibile di if è:
Codice:

if(condizione_1)
{
   ...
}
elseif(condizione_2)
{
   ...
}
....
elseif(condizione_n)
{
   ...
}
else
{
   ...
}

e ovviamente dentro ai vari casi possiamo nidificare altre if.
Di seguito confronteremo $a con $b e se $a>$b stamperemo un messaggio e in caso contrario oltre a stampare un altro testo confronteremo $b con $c e se quest'ultima sarà più grande di $b scriveremo una serie di punti esclamativi.
Codice:

<?
   $a=34;
   $b=65;
   $c=595;
   
   if ($a>$b)   
   {
      print 'a>b';
   }
   else
   {
      print 'b>=a';
      
      if ($b<$c)
         print '<br/>!!!!!!!';
   }
?>

Attenzione! La precedente non equivale a:
Codice:

<?
   $a=34;
   $b=65;
   $c=595;
   
   if ($a>$b)   
   {
      print 'a>b';
   }
   elseif($b>$a)
   {
      print 'b>=a';
      
      if ($b<$c)
         print '<br/>!!!!!!!';
   }
?>

perchè in questo caso caso entriamo nella seconda condizione solo quando $b>$a e non quando $b>=$a come nell'esempio precedente a questo.
Esistono 2 operatori che ci permettono di eseguire più controlli e ottenere una condzione più complessa: "&&" che indica "e" e "||" che indica "o".
Se volessimo controllare che se una variabile contenga un numero pari maggiore di 16 dovremmo fare una cosa del genere:
Codice:

<?
   $a=17;
   
   if ( $a%2==0 && $a>16 )
   {
      print 'Il numero &egrave; pari e maggiore di 16';
   }
   else
   {
      print 'Il numero non &egrave; pari oppure non &egrave; maggiore di 16';
   }
?>

La condizione a sinistra di "&&" controlla se $a contiene un numero pari (ossia che il resto della divisione per 2 dia resto 0) mentre quella a destra verifica se $a è maggiore di 16.
La tabella di verità dell'operatore "&&" è:
Codice:

0 && 0 => 0
0 && 1 => 0
1 && 0 => 0
1 && 1 => 1

Invece per controllare se una variabile è pari oppure maggiore di 16 utilizzeremo:
Codice:

<?
   $a=13;
   
   if ( $a%2==0 || $a>16 )
   {
      print 'Il numero &egrave; pari oppure  &egrave; maggiore di 16';
   }
   else
   {
      print 'Il numero non &egrave; pari oppure non &egrave; maggiore di 16';
   }
?>

e la tabella di verità di "||" è:
Codice:

0 || 0 => 0
0 || 1 => 1
1 || 0 => 1
1 || 1 => 1

Ovviamente possiamo complicare le cose mettendo insieme "&&" e "||" e utilizzando le parentesi tonde per stabilire le priorità dei controlli.
Quando dobbiamo fare delle scelte in base al valore assunto da una variabile, piuttosto che scrivere una catena lunghissima di if...elseif...else possiamo utilizzare il costrutto "switch" che nella forma generale è:
Codice:

switch($var)
{
   case caso_1:
      ....
      break;
   case caso_2:
      ...
      break;
   ...
   case caso_n:
      ...
      break;
   default:
      ...   
}

$var viene controllata e i casi vengono stabiliti tramite l'uso di "case" seguito dal valore valido per quella condizione; i break bloccano l'esecuzione prima di entrare nel caso successivo. "default" è l'equivalente di dire "negli altri casi...".
Il codice che segue:
Codice:

<?
   $a=13;
   
   switch ($a)
   {
      case 1:
         print 'La variabile vale 1';
         break;
      case 2:
         print 'la variabile vale 2';
         break;
      default:
         print 'la variabile non vale ne 1 ne 2';
   }
?>

si può riscrivere con una if tramite:
Codice:

<?
   $a=13;
   
   if ($a==1)
   {
      print 'La variabile vale 1';
   }
   elseif ($a==2)
   {
      print 'la variabile vale 2';
   }
   else
   {
      print 'la variabile non vale ne 1 ne 2';
   }
?>

In caso di molti casi la prima forma è preferibile.
Se omettiamo il break tra un case e l'altro otterremmo che anche il codice del case successivo viene eseguito (tranne quello prima di default) e quindi potremmo anche usare lo switch per raggruppare dei casi:
Codice:

<?
   $a='ciao';
   
   switch ($a)
   {
      case 1:
      case 2:
      case 3:
         print 'La variabile vale 1 o 2 o 3';
         break;
      case 'ciao':
         print 'La viariabile contiene un saluto';
         break;
      default:
         print 'Nulla di quello che credevo!';
   }
?>

Ovviamente tramite switch possiamo verificare solo casi di uguaglianza.

Abbiamo ancora due operatori di confronto da analizzare e sono "===" e "!==".
Sono due operatori molto potenti perchè riescono a distinguere il false dallo 0.
Alcune funzioni di php ritornano false in caso di errore ma ritornano numeri in caso di successo e tra questi numeri potrebbe esserci lo zero.
Se controllassimo il ritorno tramite "==" o "!=" non saremmo in grado di discriminare l'errore dal ritorno pari a 0.
Una funzione di queste è strpos che ritorna l'indice della prima lettera della prima occorrenza di una sottostringa in una stringa.
Se non la trova ritorna false.
Codice:

<?
   $testo="Nella foresta c'è un così bel villaggio...";
   $str="Nella";
   
   if (strpos($testo,$str)==false)
   {
      print 'Non ho trovato la sottostringa';
   }
   else
   {
      print 'Ho trovato la sottostringa';
   }
?>

Dato che strpos ritorna 0 abbiamo che tramite "==" questo venga interpretato come false e quindi entriamo nella prima if.
Se utilizzassimo "===" lo script funzionerebbe senza problemi:
Codice:

<?
   $testo="Nella foresta c'è un così bel villaggio...";
   $str="Nella";
   
   if (strpos($testo,$str)===false)
   {
      print 'Non ho trovato la sottostringa';
   }
   else
   {
      print 'Ho trovato la sottostringa';
   }
?>

In realtà "===" e "!==" non si limitano a trattare il false nel modo giusto ma controllano che i tipi dei due operatori siano identici; potremmo schematizzare il comportamento così:
Codice:

$a===$b è true <=> $a==$b e gettype($a)==gettype($b)
$a!==$b è true se $a!=$b è true oppure gettype($a)!=gettype($b)

percui 0 è intero e false è boolean quindi il false dato dallo zero viene distinto da quello vero.

Php prevede anche un operatore ternario detto if-aritmetico e la sua forma è:
Codice:

$a = ( condizione ? istruzione se condizione è vera : istruzione se condizione è falsa)

In molti casi ritorna utile come nell'esempio che segue:
Codice:

<?
   $a=6;
   $b=9;
   
   $max=($a>$b ? $a : $b);
?>

che equivale a:
Codice:

<?
   $a=?6;
   $b=9;
   
   $max=null;   // viene defnita qui per poterla "vedere" dopo la if perchè altrimenti varrebbe solo nel blocco delle graffe
   
   if ($a>$b)
   {
      $max=$a;
   }
   else
   {
      $max=$b;
   }
?>

Come potete vedere abbiamo scritto molto di più.
Possiamo anche nidificare l'operatore:
Codice:

<?
   $a=6;
   $b=9;
   
   $max=($a>$b ? $a : ($b>$a ? $b : 'uguali'));
?>

In patrica vogliamo assegnare a $max la stringa "uguali" in caso le due var abbiano lo stesso valore percui nell "?:" più esterno controlliamo se $a>$b e in questo caso assegnamo $a; altrimenti verifichiamo se $b>$a e in questo caso assegnamo $b; altrimenti assegnamo "uguali". Forse però in un caso del genere è meglio riscrivere tramite if il controllo per avere pù leggibilità.

Tutto questo conclude il discorso sui costrutti condizionali.
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi