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