2013-11-14 10 views
8

Così stavo creando un modulo oggi e mi è capitato di dare il nome di una variabile con lo stesso nome di un nome usato successivamente in un ciclo foreach. Con mia sorpresa, la dichiarazione del ciclo di foreach ha sovrascritto la precedente dichiarazione della variabile.PHP stesso nome in foreach come ambito esterno causa sovrascrittura

Per me, questo sembra piuttosto strano dato che mi aspettavo che il campo di applicazione della as $value => $a di limitare la portata delle due variabili per il ciclo foreach.

Questo è ciò che accade:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; }; 
123 
php > echo $a; 
3 

Questo è quello che mi aspettavo:

php > $a = 5; //define a in outer scope 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; /* This $a should be the one from the foreach declaration */ }; 
123 
php > echo $a; //expecting inner scope to have gone away and left me to get the outer scoped $a 

La stessa cosa accade se uso $a come la chiave di foreach ciclo, più terrificante era questo gioiello:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $a => $b){ var_dump($b); } 
int(1) 
int(2) 
int(3) 
php > var_dump($b) // => int(3) 

che ha sovrascritto lo $b array in posizione, ma ancora in loop sui suoi membri.

Tutto sommato, sembra un po 'eccentrico. La mia domanda sta chiedendo esattamente dove troverei la documentazione/il manuale che specifica che questo comportamento è previsto?

+7

Lo scopo di PHP è a livello di funzione. foreach() non crea un nuovo ambito. Detto questo, ci sarà un "alias" temporaneo creato nel caso della tua seconda versione $ b => $ b. Tuttavia, questo è più un effetto collaterale degli interni di php rispetto a un nuovo ambito creato. –

+0

Lo scoping non viene eseguito a livello di loop? – EdgeCaseBerg

+0

No. Ci sono 2 ambiti in php. funzione/metodo globale e locale. –

risposta

1

Solo le funzioni creano un nuovo ambito. l'ambito del blocco formato da parentesi graffe non ne crea uno nuovo. Nel tuo esempio sei nell'ambito globale.

Problemi correlati