PHP: Variabili Locali e Variabili Globali

thepeg, 18 Ottobre 2006

Oggi vorrei parlare dell'utilizzo delle variabili in PHP e più precisamente della differenza esistente tra variabili locali e variabili globali.

Normalmente la prima volta che ci si scontra con questo problema è quando si cerca di utilizzare una variabile definita nello script all'interno di una funzione:

<?php
$var1 = 'Marco Pegoraro';
function visualizza() { echo $var1; }
visualizza();
?>

Il codice precedente produrrà un errore in quanto la variabile $var1 non è conosciuta all'interno della funzione visualizza().

Questo errore è dovuto al fatto che PHP riserva degli spazi di definizione variabili ben distinti a livello di script, funzione ed, eventualmente, oggetto e metodo.

Questo accorgimento permette di utilizzare nomi di variabili uguali ma con contenuti diversi in parti diverse del codice. E' tuttavia possibile utilizzare variabili di script all'interno di funzioni e metodi.

Cos'è una variabile locale?

Una variabile locale è una variabile che esiste in uno spazio di allocazione ben definito, ad esempio all'interno di una funzione.

Tutte le variabili utilizzate all'interno di una funzione vengono automaticamente eliminate dallo script quando la funzione termina il suo compito.

Un esempio di utilizzo di variabile locale è:

<?php
function oraAttuale() {
$variabile_locale = time();
return $variabile_locale;
}
?>

La variabile $variabile_locale viene creata all'interno della funzione e, dopo l'istruzione di return viene distrutta dall'interprete PHP.

Cos'è una variabile globale?

Una variabile globale è una variabile che esiste in ogni spazio di allocazione utilizzato da un programma.

In PHP non esistono delle vere e proprie variabili globali.

In una funzione, per utilizzare una variabile esterna, è necessario importarla con la direttiva global. La prima porzione di codice dovrà dunque essere modificata come segue:

<?php
$var1 = 'Marco Pegoraro';

function visualizza() {
global $var1;
echo $var1;
}

visualizza();
?>

E' bene notare che la direttiva global non trasforma una variabile locale in una variabile globale ma semplicemente importa la variabile $var1 nello spazio delle variabili della funzione visualizza().

Precisazioni di configurazione:

Dire che in PHP non esistono le variabili globali non è del tutto esatto. Inizialmente (prima della versione 4.3) le variabili definite nello script, i nomi dei campi dei form inviati ed alcune variabili speciali di php venivano effettivamente gestite come variabili globali.

Questa modalità di funzionamento è data dalla direttiva register_globals definita nel file di configurazione di PHP (php.ini). Dalla versione 4.3 dell'interprete PHP questa impostazione è impostata a "off" di default rendendo di fatto inesistenti le variabili globali.

Restano tuttavia alcune variabili speciali che rimangono globali ad ogni blocco di codice. Tali variabili sono istanziate dall'interprete PHP prima dell'esecuzione del nostro codice. Alcuni esempi:

  • $_SERVER - Array associativo che contiene alcune informazioni sul server e sulle componenti software.
  • $_SESSION - Array associativo utilizzato per le variabili di sessione.
  • $_GET, $_POST - Array associativi che contengono i dati inviati da form.

Commenti all'articolo:

non capisco perchè una query mi da errore:Query fallita: Il numero delle colonne non corrisponde al conteggio alla riga 1.
questo il listato:

echo $tab= $_POST['tab'];


/* Connessione e selezione del database */
$connessione = mysql_connect("localhost", "root", "")
or die("Connessione non riuscita: " . mysql_error());
print "connesso
";
mysql_select_db("prospetto_voti_2007") or die("Selezione del database non riuscita");

/* Esecuzione di una query SQL */
$query ="SELECT * FROM ".$tab;
$risultato = mysql_query($query) or die("Query fallita: " . mysql_error() );
$campi = mysql_num_fields($risultato);
$c="";
$vc="";
echo "I valori inseriti sono:"."
";
for ($i=0; $i < $campi; $i++) {
$nome = mysql_field_name($risultato, $i);
echo $campo[$i]=$nome;echo " = ";
echo $vcampo[$i]=$_POST[$campo[$i]];echo "
";
$c=$c.",".$campo[$i];
$vc=$vc.","."'".$vcampo[$i]."'";
}
$c[0]="";
$vc[0]="";
echo $c."
";
echo $vc."
";
echo $query2 = "INSERT INTO ". $tab." values(";
echo $risultato2 = mysql_query($query2."\"". $vc ."\"". ")") or die("Query fallita: " . mysql_error() );

?>


PUOI AIUTARMI?
QUESTO E' L'OUTPUT

alunniconnesso
I valori inseriti sono:
id_alunno = 10861
cognome = CAPUTO
nome = FABIO
datanascita = 1993-12-07
luogonascita = PALERMO
classe = IIA
id_alunno,cognome,nome,datanascita,luogonascita,classe
'10861','CAPUTO','FABIO','1993-12-07','PALERMO','IIA'
INSERT INTO alunni values(Query fallita: Il numero delle colonne non corrisponde al conteggio alla riga 1



CIAO SEB
12/07/2007 14:54
by sebastiano
ho una problema con un form che prende i campi dal db mysql, una volta compilato e cliccato invia apre una pagina di riepilogo dati inseriti...il problema è che non mi passa i campi presi dal db
la select con la query è :



come faccio a passare il riultato in un'altra pagina...il semplice post non basta?
22/06/2008 19:50
by chiara
@Chiara:

Il codice che scrivi tu va a popolare un campo di una form.... sei sicura che il codice della form sia scritto correttamente?
Il passaggio di valori tra una pagina e l'altra mediante form può avvenire sfruttando 2 metodi (attributo "method" del TAG "form"): GET e POST.

GET fornisce un passaggio di variabili via url (www.sito.it/pagina.php?var1=marco&var2=peg) con il limite dei 255 caratteri che costituiscono la dimensione massima della url.
Tali variabili le recuperi via php dall'array globale $_GET['var1'].

POST fornisce un passaggio di variabili inseriti nell'header della richiesta HTTP. Questo metodo non ha veri limiti di quantità di dati se non quelli specificati da apache o da php.ini.
Tali variabili le recuperi via php dall'array globale $_POST['var1'].
23/06/2008 08:51
by thepeg

Categorie: Php;


Aggiungi il Tuo Commento:

Inviando questa risposta dichiaro di aver letto ed approvato le condizioni di utilizzo di questo sito web.

(*) = campo obbligatorio.


Condizioni di Utilizzo:

1 - Tutte le risposte inviate a questo sito saranno sottoposte a moderazione manuale da parte dell'amministratore al fine di evitare il fenomeno detto "SPAM".

2 - Tutti i dati inseriti nel modulo di risposta verranno pubblicati in questa pagina ad eccezione dell'e-mail. Tale informazione viene richiesta ed archiviata dagli amministratori al fine di scoraggiare un utilizzo non consono del blog.

3 - Non utilizzare le risposte per pubblicizzare il tuo sito web. Tale tentativo verrà cancellato dall'amministratore. In ogni caso ai link inseriti nelle risposte viene applicato il "nofollow" per cui non ti portano vantaggi.
Se vuoi possiamo discutere uno scambio link: Srivimi!