2010-05-24 2 views
33

Der folgende PHP-Code gibt 3 aus.Variabler Bereich Unterschied zwischen PHP und C: Block Scope ist nicht genau das Gleiche?

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

main(); 

Aber der folgende C-Code wird einen Kompilierungsfehler auslösen.

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

    printf("%d", i); 
} 

Also Variablen in PHP sind nicht streng Block-Bereich? In PHP können im inneren Block definierte Variablen im äußeren Block verwendet werden.

+1

Dies ist nicht wirklich eine Frage, wenn Sie es bereits beantwortet haben selbst. –

+2

@Byron - Ich möchte das nur bestätigen. Es ist komisch für mich, wer von C. – powerboy

+2

zu PHP gekommen ist, warum downvoting? Ich denke, die Frage ist in Ordnung – Andrey

Antwort

45

PHP hat nur Funktionsumfang - Kontrollstrukturen wie if führen keinen neuen Bereich ein. Es macht aber auch nichts aus, wenn Sie Variablen verwenden, die Sie nicht deklariert haben. $i wird außerhalb von main() nicht existieren oder wenn die if-Anweisung fehlschlägt, aber Sie können es immer noch frei echo.

Wenn Sie PHP error_reporting Satz enthalten sein bemerkt haben, wird es eine E_NOTICE Fehler zur Laufzeit emittieren, wenn Sie versuchen, eine Variable zu verwenden, die nicht definiert ist. Also, wenn Sie hat:

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

Der Code würde gut laufen, aber einige Ausführungen werden echo ‚3‘ (wenn die if gelingt), und einige werden ein E_NOTICE und Echo nichts heben, als $i nicht definiert werden im Rahmen der echo-Anweisung.

Außerhalb der Funktion wird $i niemals definiert (weil die Funktion einen anderen Bereich hat).

Für weitere Informationen: http://php.net/manual/en/language.variables.scope.php

+0

sehr ausführliche Erklärung! – powerboy

+2

Gute Erklärung! Aber nur weil du etwas tun kannst, heißt das nicht, dass du es tun solltest. Es ist eine schlechte Übung, eine Variable zu verwenden, die nicht definiert wurde. –

+0

Oh, und Sie müssen nicht überprüfen, ob das Ergebnis des Randaufrufs gleich Null ist. Sie können einfach einen Shebang vor Rand setzen :) – peter