2010-05-24 8 views
33

Il seguente codice PHP emetterà 3.Differenza di portata variabile tra PHP e C: l'ambito del blocco non è esattamente lo stesso?

function main() { 
    if (1) { 
     $i = 3; 
    } 
    echo $i; 
} 

main(); 

Ma il seguente codice C genera un errore di compilazione.

void main() { 
    if (1) { 
     int i = 3; 
    } 

    printf("%d", i); 
} 

Quindi le variabili in PHP non sono rigorosamente a livello di blocco? In PHP, le variabili definite nel blocco interno possono essere utilizzate nel blocco esterno?

+1

questo non è davvero una domanda se hai già risposto da solo. –

+2

@Byron - Voglio solo confermarlo. È strano per me che sono venuto in PHP da C. – powerboy

+2

perché downvoting? Penso che la domanda va bene – Andrey

risposta

45

PHP ha solo scopo funzionale - strutture di controllo come if non introducono un nuovo ambito. Tuttavia, non importa se usi variabili che non hai dichiarato. $i non esisterà al di fuori di main() o se l'istruzione if fallisce, ma è comunque possibile farlo liberamente.

Se hai impostato error_reporting di PHP per includere le comunicazioni, emetterà un E_NOTICE errore in fase di esecuzione se si tenta di utilizzare una variabile che non è stato definito. Quindi, se si ha:

function main() { 
if (rand(0,1) == 0) { 
    $i = 3; 
} 
echo $i; 
}

Il codice dovrebbe funzionare bene, ma alcune esecuzioni risuonerà '3' (quando il if riesce), e alcuni genererà un E_NOTICE ed eco nulla, in quanto non saranno definiti $i nell'ambito della dichiarazione di eco.

Al di fuori della funzione, $i non verrà mai definito (poiché la funzione ha un ambito diverso).

Per maggiori informazioni: http://php.net/manual/en/language.variables.scope.php

+0

spiegazione molto approfondita! – powerboy

+2

Buona spiegazione! ma solo perché puoi fare qualcosa non significa che dovresti. È una cattiva pratica usare una variabile che non è stata definita. –

+0

Oh, e non è necessario controllare se il risultato della chiamata rand è uguale a zero. Puoi semplicemente mettere una shebang prima di rand :) – peter

Problemi correlati