php_slides_25052004 - Università di Catania
Transcript
php_slides_25052004 - Università di Catania
Array e WHILE Si può utilizzare il anche costrutto while insieme alle istruzioni each e list nella condizione: while(list($Indice,$Valore)=each($Mio_Array)) { echo “$Indice - $Valore”; } list assegna alle variabili $Indice e $Valore rispettivamente l’indice e il valore dell’elemento restituito da each; Array nelle Stringhe ! All’interno di una stringa è possibile accedere al valore degli elementi di un array. echo “valore inserito: $Mio_Array[1]”; echo “capitale della Francia: $Capitali[Francia]”; ! Notare che all’interno di una stringa la chiave non è compresa tra virgolette doppie! Quando si è scorso tutto l’array, each restituisce un valore nullo, rendendo così falsa la condizione. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Funzioni ! Ogni vero linguaggio di programmazione ha delle possibilità per l’astrazione procedurale. ! Un modo per chiamare pezzi di codice in modo da poterli utilizzare come blocchi di costruzione. ! Il meccanismo di PHP per questo genere di astrazione è la funzione. ! Ci sono due tipi di funzioni: • Implementate nel linguaggio dagli sviluppatori. • Definite dall’utente / programmatore PHP. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Utilizzare le Funzioni ! La sintassi di base per utilizzare una funzione è: nome_funzione(espr1, espr2, …, esprN); ! Quando PHP incontra una chiamata a funzione • Valuta ogni espressione argomento. • Utilizza i valori come input per la funzione. ! Dopo l’esecuzione il valore restituito è il risultato dell’intera espressione. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Valori di Ritorno ! Ogni chiamata a funzione è un’espressione PHP. ! Ci sono solo due motivo per includerne una: • Per il suo valore di ritorno. • Per gli effetti secondari che produrrà. PHP e Funzioni ! PHP è molto pulito e flessibile, ma non c’è molto. ! La maggior parte della potenza risiede nel gran numero di funzioni incorporate (built-in). ! Gli sviluppatori possono contribuire semplicemente aggiungendo nuove funzioni. • Non cambia quello su cui gli altri si appoggiano. ! E’ possibile combinare le due ragioni. ! Si utilizza il tipo array per restituire più di un valore. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Definire le proprie funzioni ! Le definizioni di funzioni hanno la seguente forma: function nome_funzione($arg1, $arg2, …) { dichiarazione1; dichiarazione2; … } ! A differenza delle variabili I nomi di funzione vengono convertiti in minuscolo prima di essere valutati. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible ! http://www.php.net è la fonte ufficiale per tutte le informazioni. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Parametri Attuali e Formali ! Non è un requisito passare variabili come argomento. ! I parametri attuali possono essere un’espressione che calcola un valore. ! Se si passano più argomenti ? • PHP ignora I parametri in eccesso. ! Se si passano meno argomenti ? • PHP tratta I parametri formali mancanti come se fossero variabili slegate. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Ambito di funzioni e variabili ! Ogni funzione è un piccolo mondo a sè. ! In generale, il significato di una variabile all’interno di una funzione non ha niente a che vedere con il resto del codice. ! Gli unici valori a cui si ha accesso sono quelli dei parametri formali. Global vs. Local ! Per default, una variabile è locale • Ristretta all’ambito in cui è stata dichiarata. ! La dichiarazione global dice a PHP di riferirsi ad una variabile come se essa esistesse già. <? functio foo() { global $myglob; echo $myglob++; } $myglob = 0; foo(); $myglob = 7; foo(); • I valori sono quelli copiati dai parametri attuali. ! Questi comportamenti possono essere ignorati attraverso dichiarazioni particolari. ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Variabili Statiche ! Per default, le funzioni non tengono memoria della loro esecuzione. • Con ogni chiamanta di funzione le variabili locali agiscono come se fossero appena state create. ! La dichiarazione static ignora questo comportamento, facendo mantenere il valore tra una chiamata e l’altra alla funzione. Variabili Statiche (2) ! E’ possibile fornire un valore iniziale alla variabile static. • Questo valore viene dato solo la prima volta. <? functio foo() { static $myglob = 0; echo $myglob++; } for($I=0;$I<10;$I++) foo(); <? functio foo() { static $myglob; echo $myglob++; } for($I=0;$I<10;$I++) foo(); ?> ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Ambito per le funzioni ! Ancora più semplice delle variabili! ! Le funzioni devono essere definite una volta dallo script. ! L’ambito delle funzioni è implicitamente globale. ! Una funzione definita da qualche parte in uno script è disponibile dovunque in quello script. ! PHP4 precompila gli script. • Potete definire le funzioni anche dopo un loro utilizzo. • PHP3 NO!. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Ancora su include e require ! Entrambe le funzioni impostano nel file in esecuzione, il contenuto del file passato. ! A differenza di include, require viene chiamata una sola volta anche se presente più volte (ex: ciclo for). • PHP sostituirà alla chiamata require il contenuto del file. • Non è abbastanza intelligente da tenere traccia delle chiamate precedenti. • Si possono creare pericolosi loop da cui difficilmente usciremo. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Una soluzione semplice ! $isloaded è una variabile istanziata all’interno del file incluso. <? Funzioni Ricorsive ! In PHP4 le funzioni ricorsive non sono un problema. • Non è necessario definire le funzioni prima di utilizzarle. <? if(!IsSet($isloaded)) include(“miefunzioni.inc”); functio foo($counter) { if($counter > 0) { echo “contatore: “ . $counter; foo(--$counter); } } foo(10); ?> ?> ! Assicuratevi che ci sia un caso base! DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Tips & Tricks ! Spesso è utile avere il numero di argomenti passati dipendente dal contesto in cui la funzione viene chiamata. ! Ci sono tre modi per farlo: • Definire la funzione con argomenti predefiniti; quelli mancanti nella chiamata avranno il valore predefinito. • Utilizzare un argomento array per contenere I valori. Il corpo della funzione deve analizzarlo nel modo corretto. • Utilizzare le funzioni: Argomenti Predefiniti ! Basta trasformare semplicemente il nome del parametro formale in un’espressione di assegnamento. • PHP farà corrispondere gli attuali ai formali sino a quando c’è ne sono disponibili. <? functio foo($arg1 = “parametro1”, $arg2 = “parametro2”, $arg3 = “parametro3”) { echo “\$arg1 è $arg1, \$arg2 è $arg2, \$arg3 è $arg3”; } foo(“qui”); foo(“qui”, “quo”); foo(“qui”, “quo”, “qua”); " func_num_args(), func_get_arg(), func_get_args() ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Array come parametri ! E’ possibile utilizzare un array come canale di comunicazione. <? functio foo($myarray) { if(!is_array($myarray)) return false; $a = IsSet($myarray[‘arg1’]) ? $myarray[‘arg1’] : “parametro1”; $b = IsSet($myarray[‘arg2’]) ? $myarray[‘arg2’] : “parametro2”; $c = IsSet($myarray[‘arg3’]) ? $myarray[‘arg3’] : “parametro3”; echo “\$a è $a, \$b è $b, \$c è $c”; } foo(array()); $tmp=array(‘arg1’ => ‘miopar1’, ‘arg2’ => ‘miopar2’, ‘arg3’ => ‘miopar3’); foo($tmp); ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Argomenti multipli ! func_num_args() • Non prende argomenti. Restituisce il numeri di argomenti passati alla funzione da cui è stata chiamata. ! func_get_arg() • Prende un argomento intero n e restituisce l’n-esimo argomento alla funzione da cui è stata chiamata. Gli argomenti sono numerati a partire da 0. ! func_get_args() • Non prende argomenti e restituisce un array contenente tutti gli argomenti nella funzione dalla quale è stata chiamata. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Esempio <? functio foo() { $count=func_num_args(); $a = $count > 0 ? func_get_arg(0) : “parametro1”; $b = $count > 1 ? func_get_arg(1) : “parametro2”; $c = $count > 2 ? func_get_arg(2) : “parametro3”; echo “\$a è $a, \$b è $b, \$c è $c”; } foo(); foo(“primo”, “secondo”); ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible valore vs. riferimento ! In PHP il comportamento predefinito è chiamata per valore. • PHP fà copie delle variabili quando le si passano. • La funzione non è in grado di modificare il contenuto originale. ! E’ possibile fare in modo che le funzioni modifichino I valori passati, con due modalità diverse: • Nella definizione di funzione. • Nella chiamata di funzione. (già visto) DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Valore vs. riferimento (2) ! Se si vuole definire il valore di un parametro di una funzione per riferimento, è sufficiente una ‘&’ davanti al parametro formale. <? functio foo(&$arg1, $arg2) { echo “\$arg1 è $arg1, \$arg2 è $arg2”; $arg1 = “valore alterato!”; } $a = “parametro1”; $b = “parametro2”; foo($a, $b); foo($a, $b); ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Variabili nomi di funzione ! Invece di scrivere un nome di funzione nel codice, si assegna la funzione ad una variabile. ! Chi conosce il C, penserà ai ‘famosi’ puntatori a funzione. ! Chi conosce Scheme o Common Lisp, troverà il discorso molto familiare. <? functio foo() { echo “Hello, World!”; } $a = ‘foo’; $a(); ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Apertura di files Funzioni di Lettura e Scrittura su file ! La lettura dei files è abbastanza sicura • Se sulla macchina che usiamo non girano documenti ‘sensibili’. ! La scrittura è un’azione pericolosa. ! Cercate di confinare le operazioni di I/O su file. ! Siate coscienti che ci possono essere problemi. ! Solo utenti accreditati dovrebbero fare operazioni sul file system. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible ! fopen(nome_file, modalità); • E’ necessario assegnare il risultato di fopen() ad una variabile. • Se la funzione và a buon fine, PHP assegnerà al risultato un valore intero. Altrimenti un valore falso. • Richiesto da operazioni successive. ! Il sistema vi mette a disposizione un numero limitato di descrittori di files. • Appena terminate le operazioni su di un file, dovreste chiuderlo. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Apertura di files (2) ! Possono essere aperti in sei modi differenti: • • • • • • “r” - sola lettura. “r+” - lettura e scrittura. “w” - solo scrittura. “w+” - scrittura e lettura. “a” - solo scrittura alla fine di un file. “a+” - lettura e scrittura alla fine di un file. DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Apertura di files (3) ! 4 tipi di connessioni che possono essere aperte: • • • • HTTP FTP I/O standard File System DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Apertura di files: http ed ftp ! fopen HTTP • Cerca di aprire una connessione HTTP ad un file normalmente servito da un server WEB. • PHP ‘bara’ e fà credere che la richiesta arrivi da un browser che stà navigando. $fd = fopen(“http://www.miosito.org/index.html/”, “r”); ! fopen FTP • Cerca di stabilire una connessione FTP ad un server remoto. • Il server remoto deve supportare il modo passivo. • Le operazioni possono essere o di scrittura o di letture. (non tutte e due contemporanemente). Apertura di files: filesystem ! E’ il modo più comune! ! A meno di particolari specifiche (http, ftp) PHP utilizzerà di default questo metodo. $fd = fopen(“/somewhere/location/myfile.txt”, “r”); ! Ricordare che I files e le directory devono essere leggibili o scrivibili dal processo UID di PHP. • Se si condivide un server tra più utenti, qualunque altro utente PHP sarà in grado di leggere I files. $fd=fopen(“ftp://nomeutente:[email protected]/pag.txt/”, “r”); DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Lettura di file ! fread() prende come argomenti un identificatore di file ed una dimensione del file in bytes. ! Se la dimensione di file non è sufficente a leggere l’intero file, PHP si arresterà al byte specificato. ! A meno di non avere particolari motivi è meglio che PHP trovi la dimensione esatta di tutto il file, usando la funzione filesize(nomefile). Lettura di file (2) $mystring = fread($fd, filesize($nomefile)); ! Estremamente utile! • Permette di trasfoamre qualsiasi file in stringa. • Le stringhe possono essere manipolate con milioni di funzioni! • Dividere le stringhe in array ( file() , explode() ) ! Se si vuole leggere l’ouput su pagina web, utilizzare la funzione readfile(nomefile). $mystring = fread($fd, filesize($nomefile)); DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Lettura di file (3) ! Per fare operazioni sulle singole righe si può usare la funzione: fgets(descrittore, bytes). Lettura di file (4) ! Se si desidera leggere il file come un array, è possibile utilizzare la funzione: file(nomefile). ! Crea un array: ogni elemento è una riga del file originale con un carattere di interruzione riga. <? $fd = fopen(“esempio.txt”, “r”); while(!feof($fd)) { $riga = fgets($fd, 4096); if(strcmp($riga, $destinazione) == 0) echo “trovata corrispondenza!”; } fclose(fd); //ricordarsi di chiudere!!! ?> ! La funzione file non richiede un’operazione separata di apertura e chiusura file. <? $fd = fopen(“esempio.txt”, “r”); // NON SERVE $myarray = file(“esempio.txt”); fclose(fd); // NON SERVE ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible Scrittura di file ! fwrite(descrittore, stringa). • Prende in input un descrittore ed una stringa. • Restituisce il numero di caratteri scritti ! fputs(descrittore, stringa). • E’ identica ad fwrite. ! La scrittura di files in un server WEB può essere un problema di sicurezza. ! A meno di non avere buoni motivi per farlo, non fatelo!!! feof ! La funzione feof controlla la fine del file su un puntatore di file. ! Prende come argomento un nome di file. <? $fd = fopen(“esempio.txt”, “r”); while(!feof($fd)) { $riga = fgets($fd, 4096); if(strcmp($riga, $destinazione) == 0) echo “trovata corrispondenza!”; } fclose(fd); //ricordarsi di chiudere!!! <? $fd = fopen(“esempio.txt”, “w”); $mystring = “Hello World!”; $fout = fwrite($fd, $mystring); echo “Ho scritto $fout caratteri!”; fclose(fd); ?> ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible File_exists ! La funzione file_exists() può essere utilizzata quando si agisce sul file system. ! Controlla il fs locale per cercare un file dal nome specificato: <? if(!file_exists(“esempio.txt”)) { $fd = fopen(“esempio.txt”, “w+”); } else { $fd = fopen(“esempio.txt”, “a+”); } fclose(fd); //ricordarsi di chiudere!!! ?> DMI - Università di Catania - Dott. Costantino Pistagna <[email protected]> - BSD restrictions applies where possible