PHP 2 Array, operatori, costrutti 1
Array in PHP Gli array conservano un gruppo di valori che possiamo recuperare o attraverso un numero intero (iniziando dallo 0) oppure attraverso una stringa (array associativi) Esempio $vino['sa'] = "Furore Bianco"; $vino['av'] = "Greco di Tufo"; $vino['na'] = "Biancolella"; Tecnologie di Sviluppo per il WEB 2
Creazione Array Si può creare un array semplicemente inserendo degli elementi in esso $professori[0] = costagliola ; $professori[1] = blundo ; $professori[2] = parente ; equivalente a: $professori[] = costagliola ; $professori[] = blundo ; $professori[] = parente ; La funzione array() serve a creare un array. I parametri passati in input sono usati come elementi dell array $professori = array( costagliola, blundo, parente ); Tecnologie di Sviluppo per il WEB 3
Esempio $spesa = array("mele", "pere", "pane", "latte"); // oppure $spesa[0] = "mele"; $spesa[1] = "pere"; $spesa[2] = "pane"; $spesa[3] = "latte"; // ma anche $spesa[] = "mele"; $spesa[] = "pere"; $spesa[] = "pane"; $spesa[] = "latte"; Tecnologie di Sviluppo per il WEB 4
Accesso ad array La funzione count restituisce la grandezza dell array Per accedere all elemento i-esimo si accede all elemento i-1 $professori[2]; Se si accede ad un elemento non inizializzato non viene generato nessun errore Tecnologie di Sviluppo per il WEB 5
Esempio ESEMPIO <?php $professori[] = "blundo"; $professori[] = "costagliola"; $professori[2] = "parente"; $professori[10] = "d'ambrosio"; printf( L'array contiene %d elementi\n, count($professori)); print( <br> ); for($i=0; $i< count($professori); $i++) { echo $i+1,") "; print(ucwords($professori[$i])); print("<br>"); } echo "Undicesimo elemento: ",$professori[10],"<br>"; echo "Centesimo elemento: ", $professori[99];?> Tecnologie di Sviluppo per il WEB 6
Risultato Tecnologie di Sviluppo per il WEB 7
Nota Invece di scrivere for($i=0; $i< count($professori); $i++) è meglio scrivere $cnt = count($professori); for($i=0; $i<$cnt; $i++) In questo modo la funzione count() è invocata solo una volta e non count($professori) volte Tecnologie di Sviluppo per il WEB 8
Altro modo per creare array Usando l operatore => si possono specificare gli indici dell array per ogni elemento, se non lo si usa l array costruito è indicizzato sugli interi a partire dallo 0 (zero) $frutta = array(1=> mele, 2=> pere, 3=> banane ); Tecnologie di Sviluppo per il WEB 9
Esempio <?php $frutta = array(1=>"mele", 2=>"pere", 3=>"banane"); $cnt=count($frutta); for($i=1; $i<= $cnt; $i++) echo $i, ") ", $frutta[$i], "<br>";?> Tecnologie di Sviluppo per il WEB 10
Esempio di array associativo $corso['blundo'] = tsw1 ; $corso['costagliola'] = tsw2 $corso['parente'] = tsw3 ; Oppure $corso = array('blundo' => 'tsw1', 'costagliola' => tsw2, 'parente' => 'tsw3' ); Tecnologie di Sviluppo per il WEB 11
Accesso ad array associativi Per far riferimento ad un elemento dell array associativo usiamo la seguente sintassi: $corso[parente] $corso['costagliola'] $corso["blundo"] $corso[$nome] Tecnologie di Sviluppo per il WEB 12
Esempio <?php $corso = array('blundo' => 'tsw1', "costagliola" => 'tsw2', 'parente' => 'tsw3'); echo $corso[blundo],"<br>"; echo $corso['costagliola'],"<br>"; echo $corso["parente"],"<br>"; $nome= "blundo"; echo $corso[$nome];?> Tecnologie di Sviluppo per il WEB 13
Accesso alle chiavi (indici) di un array In PHP possiamo accedere anche al valore delle chiavi (indici) di un array associativo senza conoscerle. Si usa la funzione each($nomearray) e le parole chiave key e value $corso e' il nome dell'array: for($i=0; $i< $cnt; $i++) { $riga = each($corso); echo $riga[key], " insegna ", $riga["value"],"<br>"; } ESMPIO Tecnologie di Sviluppo per il WEB 14
La funzione each() Ogni array in PHP conserva traccia del corrente elemento con cui stiamo lavorando Il puntatore all elemento corrente è noto come iteratore La funzione each() restituisce un array associativo che contiene due elementi e muove l iteratore una posizione in avanti Il primo elemento è indicizzato dalla stringa key Il secondo elemento è indicizzato dalla stringa value Tecnologie di Sviluppo per il WEB 15
Altre funzioni su iteratori current() Restituisce il valore dell elemento puntato dall iteratore corrente key() Restituisce la chiave dell elemento corrente reset() Muove l iteratore al primo elemento dell array next() prev() end() Tecnologie di Sviluppo per il WEB 16
Esempio <h2>utilizzo di iteratori su array</h2> <?php $corso = array(blundo => 'tsw1', "parente" => 'tsw2', 'cost' => 'tsw3'); reset($corso); echo "<table border=\"2\">\n"; echo "<tr> <th> Chiave </th> <th> Elemento </th> </tr>\n"; echo "<tr> <td> ", key($corso), "</td> <td>", current($corso), "</td> </tr>\n"; while(next($corso)) { echo "<tr> <td> ", key($corso), "</td> <td>", current($corso), "</td> </tr>\n"; } echo "</table>\n";?> ESEMPIO Tecnologie di Sviluppo per il WEB 17
HTML inviato al client <h2>utilizzo di iteratori su array</h2> <table border="2"> <tr> <th> Chiave </th> <th> Elemento </th> </tr> <tr> <td> blundo</td> <td>tsw1</td> </tr> <tr> <td> parente</td> <td>tsw2</td> </tr> <tr> <td> costagliola</td> <td>tsw3</td> </tr> </table> Tecnologie di Sviluppo per il WEB 18
Ordinare array sort() Ordina i valori dell array (crescente) distrugge il valore delle chiavi asort() Ordina i valori dell array conservando la correlazione tra il valore e la sua chiave ksort() Ordina le chiavi conservando la correlazione tra il valore e la sua chiave rsort() rasort() rksort() Ordinamento in ordine inverso ESEMPIO Tecnologie di Sviluppo per il WEB 19
Ordinare array secondo un proprio ordine usort(nomearray, NomeFunzione) ordina NomeArray secondo il criterio specificato dalla funzione NomeFunzione function cmp ($a, $b) { if ($a == $b) return 0; return ($a < $b)? -1 : 1; } $arr = array (3, 2, 5, 6, 1); usort ($arr, "cmp"); while (list ($chiavve, $vallore) = each ($arr)) { echo "$chiavve: $vallore\n"; } La funzione list copia i valori dell'array nelle vbls Ordinamento crescente di $a Tecnologie di Sviluppo per il WEB 20
Risultato Il risultato dello script precedente è 0: 1 1: 2 2: 3 3: 5 4: 6 E' un esempio, sarebbe stato più opportuno usare la funzione sort() E' spesso usata per array multidimensionali. Tecnologie di Sviluppo per il WEB 21
Nota La funzione di confronto scritta dall utente deve ricevere in input due parametri e restituire un intero Minore di zero se il primo parametro è da considerarsi minore del secondo Uguale a zero se i due parametri sono da considerarsi uguali Maggiore di zero se il primo parametro è da considerarsi maggiore del secondo Tecnologie di Sviluppo per il WEB 22
Array multidimensionali 1 Ogni elemento di un array può essere di tipo qualunque, anche di tipo array Un array multidimensionale è un array che contiene altri array for($i=1; $i < $n; $i++) for($j=1; $j < $n; $j++) $a[$i][$j] = $i * $j; Tecnologie di Sviluppo per il WEB 23
Array multidimensionali 2 $riga0 = array(1, 2, 3); $riga1 = array(4, 5, 6); $riga2 = array(7, 8, 9); $multi = array($riga0, $riga1, $riga2); print_r($multi); /* human readable print */ Tecnologie di Sviluppo per il WEB 24
Ordinare array multipli con usort $products = array( array( 'Tires', 100 ), array( 'Oil', 10 ), array( 'Spark Plugs', 4 )); ordina sulla seconda colonna function compare($x, $y){ if ( $x[1] == $y[1] ) return 0; else if ( $x[1] < $y[1] ) return -1; else return 1; } usort($products, 'compare'); ESEMPIO Tecnologie di Sviluppo per il WEB 25
Funzioni su array (1/2) array_pad(array, nbr_elmnts, value) Restituisce un nuovo array con nbr_elmnts, padded con altri elementi inizializzati allo stesso value. Esempi: $scores = array(3,10); $padded=array_pad($scores, 5,0); $padded è (3,10,0,0,0); $padded=array_pad($scores,-5,0); $padded è (0,0,0,0,0) $scores=array_pad($scores,5,0) modifica in situ Tecnologie di Sviluppo per il WEB 26
Funzioni su array (2/2) array_chunk(array, size [,preserve_keys]) Restituisce un array multidimensionale fatto degli elementi di array. Ogni riga è lunga size preserve_keys: booleano array_slice(array, offset, length) Restituisce un sotto-array di array lungo length a partire dalla posizione offset list($var1, $var2, ) = $array Copia i valori di $array nelle variabili $var1, $var2 array_key_exists(chiave, array) Restituisce un booleano se esiste la chiave nell'array. in_array(valore, array) Booleano: se valore è in array Chunk Tecnologie di Sviluppo per il WEB 27
Esempio di list È usata per assegnare valori ad una lista di variabili in una sola istruzione, i valori sono presi da un array $info = array('caffè', 'scuro', 'caffeina'); // assegna tutte le variabili list($bevanda, $colore, $componente) = $info; // assegna solo in parte list($bevanda,, $componente) = $info; // assegna solo l'ultima variabile list(,, $componente) = $info; Tecnologie di Sviluppo per il WEB 28
Altre funzioni sugli array array_walk(array, func[,terzoprmtr] ) Chiama la funzione func su ogni elemento dell array func deve avere almeno due parametri (opzionalmente tre): il primo identifica il valore dell'elemento; il secondo identifica la chiave; il terzo un parametro generico di func. array_filter(array, func) Restituisce un array. Ogni valore di array è passato a func, l array restituito contiene solo quegli elementi di array per cui la funzione func ha restituito true Tecnologie di Sviluppo per il WEB 29
Esempio di array_walk <h2>utilizzo di funzioni su array</h2> <?php $frutta = array ("uno"=>"limone", "due"=>"arancia", "tre"=>"banana"); function modifica (&$elemento, $chiave, $prefisso) { /* write */ $elemento = "$prefisso:::::::::: $elemento"; } function stampa ($elemento, $chiave) { /* read */ echo "$chiave: $elemento<br>\n"; } echo "<h3>prima...:\n</h3>"; array_walk ($frutta, 'stampa'); array_walk ($frutta, 'modifica', 'frutto'); echo "<h3>... e dopo:\n</h3>"; array_walk ($frutta, 'stampa');?> ESEMPIO Tecnologie di Sviluppo per il WEB 30
Esempio array_filter <h2>utilizzo di array_filter</h2> <?php function dispari($var) { return ($var % 2); } function pari($var) { return (!($var % 2)); } $array1 = array ("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); $array2 = array (6, 7, 8, 9, 10, 11, 12); echo "<h3>array iniziali :</h3>\n"; print_r($array1); echo "<br>"; print_r($array2); echo "<h3>applico la funzione 'dispari' al primo array :</h3>\n"; print_r(array_filter($array1, "dispari")); echo "<h3>applico la funzione 'pari' al secondo array:\n</h3>"; print_r(array_filter($array2, "pari"));?> esempiowalkconfilter ESEMPIO Tecnologie di Sviluppo per il WEB 31
Conversione tra variabili e array PHP fornisce due funzioni extract() e compact() che permettono di creare variabili da array e viceversa Si usano con gli array associativi $frutta = array ("uno"=>"limone", "due"=>"arancia", "tre"=>"banana"); extract($frutta); Dopo esistono le variabili $uno, $due e $tre, con i valori limone, arancia e banana, rispettivamente. Tecnologie di Sviluppo per il WEB 32
Nota su extract() Possiamo aggiungere automaticamente un prefisso a tutte le variabili create extract($nomearray, EXTR_PREFIX_SAME, prefisso ) Tutte le variabili che vanno in conflitto con una vbl esistente (con lo stesso nome) inizieranno con prefisso_ extract($frutta, EXTR_PREFIX_SAME, gusto ); echo $gusto_uno; Tecnologie di Sviluppo per il WEB 33
compact() È il complemento di extract() A partire da una lista di variabili, crea un array associativo le cui chiavi sono i nomi delle variabili $nome = "ambrogio"; $cognome = "unz"; $corso = "tsw"; $record = compact('nome', 'cognome', 'corso'); // oppure $chiavi=array(nome, cognome, corso); $record=compact($chiavi); Tecnologie di Sviluppo per il WEB 34
Array e stringhe In PHP esistono due funzioni per passare da una stringa ad un array e viceversa explode() Passa da una stringa ad un array implode() Passa da un array ad una stringa Tecnologie di Sviluppo per il WEB 35
explode() Applicata su una stringa restituisce un array di sottostringhe individuate dal delimitatore Sintassi explode(delimitatore, stringa [, limite]) limite è un parametro opzionale che indica il massimo numero di elementi da estrarre da stringa Esempio $pizza = "mozzarella pomodoro basilico olio"; $ingredienti = explode(" ", $pizza); Tecnologie di Sviluppo per il WEB 36
implode() Applicata ad un array restituisce una stringa rappresentante gli elementi dell array divisi da un separatore Sintassi implode(separatore, array) Esempio $array = array('ambrogio', 'ambunz@unisa.it'); $stringa = implode(",", $array); ESEMPIO Tecnologie di Sviluppo per il WEB 37
Oggetti in PHP PHP supporta la programmazione orientata agli oggetti PHP supporta Incapsulazione Polimorfismo Ereditarietà L ereditarietà multipla è supportata come in JAVA (con le interfacce) Vedremo un esempio di OOP con una classe per MySQL (?) Tecnologie di Sviluppo per il WEB 38
PHP: 5 4 (1) Membri e metodi public private Protected Metodi e Classi Astratte Solo firme, senza implementazioni Interfacce Tecnologie di Sviluppo per il WEB 39
PHP: 5 4 (2) La parola chiave per metodi e membri final Clonare Oggetti function clone() Viene verificato se esiste un tale metodo nella classe. In caso negativo una versione di default viene invocata. Tecnologie di Sviluppo per il WEB 40
PHP: 5 4 (3) Costruttore Unificati function construct() È utile per invocare costruttori di genitori da classi derivate Non c'è bisogno di conoscere il nome Distruttori function destruct() Quando l'ultimo riferimento ad un oggetto è distrutto, il metodo distruttore viene invocato. Non ha parametri Tecnologie di Sviluppo per il WEB 41
PHP: 5 4 (4) Costanti const cstn= HELLO WORLD ; Eccezioni C'è il supporto per la clausola catch all Ma non per quella finally Vbls membri static di Classi Statiche possono ora essere inizializzate Metodi statici Tecnologie di Sviluppo per il WEB 42
PHP: 5 4 (5) Metodo Instanceof Utile per accertarsi se un oggetto è una istanza di una classe, estende una classe oppure implementa un'interfaccia Iterazione <?php class Foo { var $x = 1; var $y = 2; } $obj = new Foo; foreach ($obj as $prp_name => $prop_value) { echo $prp_name = $prop_value\n ; }?> Tecnologie di Sviluppo per il WEB 43
PHP: 5 4 (6) Il nuovo metodo magico tostring() Permette di sovraccaricare la conversione a stringa dell'oggetto Altri dettagli all'url http://www.zend.com/php5/articles/engine2-php5-changes.php Tecnologie di Sviluppo per il WEB 44
Operatori in PHP 1 Aritmetici +, -, *, /, % Assegnamento = (supporta la forma abbreviata: e.g., += ) Incremento/decremento ++ e -- (prefisso/postfisso) Operatori bitwise &,, ^ (xor), ~, <<, >> Tecnologie di Sviluppo per il WEB 45
Operatori in PHP 2 Confronto ==, ===(tipato),!=,!==, <, >, <=, >= Logici &&, and,, or, xor,! Condizionale?: (if aritmetico) Casting (int), (float), (string), (bool), (array), (object) Tecnologie di Sviluppo per il WEB 46
Operatori in PHP 3 Controllo dell errore (@) Quando @ precede un comando, gli errori eventualmente generati sono ignorati Esecuzione (`) La stringa all interno di ` (backtick) è passata alla shell per essere eseguita: $output = `ls -al`; echo "<pre>$output</pre>"; domanda: se tolgo <pre>?? backtick.php Tecnologie di Sviluppo per il WEB 47
Operatori di confronto L operatore == testa se due espressioni sono uguali (anche dopo aver effettuato delle conversioni di tipo) 1 == 1 -> true 1 == 1 -> true L operatore === testa se due espressioni sono identiche (le due espressioni devono essere uguali e dello stesso tipo) 1 === 1 -> true 1 === 1 -> false ESEMPIO Tecnologie di Sviluppo per il WEB 48
Istruzioni per il controllo del flusso 1 if (condizione) istruzioni if(condizione) istruzioni1 else istruzioni2 Tecnologie di Sviluppo per il WEB 49
Istruzioni per il controllo del flusso 2 if(condizione1) istruzioni1 elseif(condizione2) istruzioni2. else istruzionin Tecnologie di Sviluppo per il WEB 50
Istruzioni per il controllo del flusso 3 Istruzione switch switch($a) { case 1: print("a è uguale a uno"); break; case 2: print("a è uguale a due"); break; default: print("a non vale né uno né due"); } Tecnologie di Sviluppo per il WEB 51
Cicli while(condizione) istruzioni do istruzioni while(condizione); for(inizializzazione; condizione; incremento) istruzioni Tecnologie di Sviluppo per il WEB 52
Ciclo foreach Permettere di iterare sugli elementi di un array foreach($nomearray as $elemento) { istruzioni } $elemento assumerà tutti i valori contenuti in $nomearray Tecnologie di Sviluppo per il WEB 53
Ciclo foreach 2 Possiamo scorrere contemporaneamente le chiavi e gli elementi di un array foreach($nomearray as $indice => $elemento) { istruzioni } Le variabili $indice ed $elemento assumeranno, rispettivamente, tutti i valori delle chiavi e degli elementi contenuti in $nomearray Tecnologie di Sviluppo per il WEB 54
exit Termina l esecuzione di uno script Ha un argomento opzionale Se è un numero, indica lo stato di uscita del processo Se è una stringa, viene stampata prima che il processo termini exit() è un sinonimo di die() $handle = @mysql_connect( localhost,$user, $passwd) or die( Connessione fallita ); Tecnologie di Sviluppo per il WEB 55
Includere del codice 1 PHP offre due possibilità per includere un documento (e.g., una libreria) in uno script PHP include e require La differenza principale è che require genera un errore fatale se non si trova il file da includere; mentre, include genera solo un warning Sintassi include NomeFile ; require NomeFile Tecnologie di Sviluppo per il WEB 56
Includere del codice 2 Per sopprimere gli errori possiamo usare @include In genere require è usato per includere delle librerie; mentre, include è usato per includere del codice HTML comune a più documenti Inclusioni di file con estensione.php includono l output dello script quindi... Tecnologie di Sviluppo per il WEB 57
Includere del codice 3 Per cui si usa l estensione.inc per le librerie e l estensione.html per documenti Un modo più efficiente per gestire intestazioni e piè pagina è quello di includere una libreria e poi invocare delle funzioni per generare le parti comuni Se vogliamo essere sicuri che il file sia inserito una sola volta usiamo require_once e include_once Tecnologie di Sviluppo per il WEB 58
Esempio pagina.php <html> <head>.. </head> <body> <?php include header.html ;?> Contenuto HTML <?php include footer.html ;?> </body> </html> Potrebbe andare in un file che viene incluso ESEMPIO Tecnologie di Sviluppo per il WEB 59
Esempio di Libreria <html> <head>.. </head> <body> <?php require_once sito.inc ; genheader();?> Contenuto HTML <?php genfooter();?> </body> </html> Tecnologie di Sviluppo per il WEB 60
Funzioni in PHP 1 La sintassi per definire una funzione in PHP è la seguente: function NomeFunzione([lista parametri]) { implementazione } La lista dei parametri è una sequenza di variabili separate da virgola Non è permesso l overloading Il nome delle funzioni NON è case sensitive È possibile usare un numero variabile di argomenti Inoltre ad ogni parametro può essere assegnato un valore di default...: att.ne (vedi slides successive) Tecnologie di Sviluppo per il WEB 61
Valori di default <?php // il terzo parametro ha un valore di default function descrivi_film($titolo, $regista, $bn_colori = 'colori') { echo "Titolo: $titolo <br>"; echo "Regista: $regista <br>"; echo "B/N - colori: $bn_colori <br>"; } // chiamo la funzione passando 2 soli parametri // il terzo è sottointeso descrivi_film('il malato immaginario','tonino Cervi'); echo '<br>'; // chiamo la funzione passando tutti e 3 i parametri descrivi_film('i soliti ignoti','mario Monicelli','bianco e nero');?> Tecnologie di Sviluppo per il WEB 62
Scope di vlbs: (meravigliati?) 1. <?php 2. function quadrato($a) 3. { 4. $a = $a * $a; 5. } 6. 7. $numero = 2; 8. quadrato($numero); 9. echo $numero; //stampa 2!!! 10.?> Tecnologie di Sviluppo per il WEB 63
Funzioni in PHP 2 Gli argomenti possono essere passati per valore o per riferimento Per passare un argomento per riferimento è sufficiente, nella definizione della funzione, far precedere l argomento da & La chiamata si effettua come al solito Se il nome della funzione è preceduto da &, allora la funzione restituirà un valore per riferimento Tecnologie di Sviluppo per il WEB 64
Funzioni in PHP 3 Le variabili all interno di una funzione sono sempre locali Per accedere alle variabili globali dobbiamo dichiararle con la parola chiave global Le funzioni non conservano memoria della loro esecuzione a meno dell uso di variabili static Una funzione definita in uno script è disponibile ovunque in quello script Per chiarezza è meglio definire le funzioni all inizio, ma non è necessario Tecnologie di Sviluppo per il WEB 65
Funzioni in PHP 4 In aggiunta alle usuali funzioni fornite dai linguaggi di programmazione (manipolazione di array, date e tempo, stringhe, funzioni matematiche, ), PHP supporta un grande numero di funzioni che lo collegano ad altri tipo di software (molte di queste funzioni richiedono una speciale installazione): MySQL, MS SQL, Oracle 8 Shockwave Flash PDF, XML IMAP, POP3, NNTP E tanti altri ancora Tecnologie di Sviluppo per il WEB 66
Funzioni con numero variabile di argomenti Esistono tre funzioni per accedere al numero dei parametri ed ai parametri stessi di una funzione $array = func_get_args(); $num = func_num_args(); $valore = func_get_arg(indice); da 0 a $num-1 Il risultato di uno qualsiasi di queste funzioni non può essere usato direttamente, ma deve sempre essere associato prima ad una variabile Tecnologie di Sviluppo per il WEB 67
Valori restituiti Passati con l istruzione return Per far restituire più valori è sufficiente restituire un array function return_due() { return array( a, 3); } Tecnologie di Sviluppo per il WEB 68
Uso di funzioni anonime (closure), come assegnazioni a variabili. È possibile associare il nome di una funzione ad una variabile e poi invocare la funzione attraverso questa variabile function max($a, $b) { return ($a>$b? $a : $b); } $massimo = max ; $massimo(3,4); //restituisce 4 Tecnologie di Sviluppo per il WEB 69
Ancora funzioni anonime Possiamo crearle con create_function(); Sintassi $valorerestituito = create_function($stringaargomenti, $stringacorpo); Esempio $lambda = create_function( $a, $b, return(strlen($a) strlen($b)); ); Tecnologie di Sviluppo per il WEB 70