2010-05-24 21 views
33

El siguiente código PHP dará salida a 3.Diferencia de alcance variable entre PHP y C: ¿el alcance del bloque no es exactamente el mismo?

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

main(); 

Pero el siguiente código C levantará un error de compilación.

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

    printf("%d", i); 
} 

Entonces, ¿las variables en PHP no son estrictamente de bloque? En PHP, ¿las variables definidas en el bloque interno se pueden usar en el bloque externo?

+1

esto no es realmente una pregunta si ya ha contestado usted mismo. –

+2

@Byron - Solo quiero confirmar esto. Es extraño para mí que viniera a PHP de C. – powerboy

+2

¿por qué downvoting? Creo que la pregunta está bien – Andrey

Respuesta

45

PHP solo tiene alcance de función: las estructuras de control como if no introducen un nuevo ámbito. Sin embargo, tampoco le importa si usa variables que no ha declarado. $i no existirá fuera de main() o si la instrucción if falla, pero aún puede hacer eco libremente.

Si tiene un juego de error_reporting de PHP para incluir avisos, emitirá un error en tiempo de ejecución E_NOTICE si intenta utilizar una variable que no ha sido definida. Así que si tenía:

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

El código se ejecuta bien, pero algunas ejecuciones se hará eco de '3' (cuando el if tiene éxito), y algunos lanzará una E_NOTICE y el eco nada, como $i no se definirá en el alcance de la declaración de eco.

Fuera de la función, nunca se definirá $i (porque la función tiene un alcance diferente).

Para más información: http://php.net/manual/en/language.variables.scope.php

+0

¡con una explicación muy detallada! – powerboy

+2

¡Buena explicación! pero solo porque puedes hacer algo no significa que debas hacerlo. Es una mala práctica usar una variable que no se ha definido. –

+0

Ah, y no necesita verificar si el resultado de la llamada rand es igual a cero. Simplemente puedes poner un shebang antes de rand :) – peter

Cuestiones relacionadas