2010-05-24 4 views
33

다음 PHP 코드는 3을 출력합니다.PHP와 C의 가변 범위 차이 : 블록 범위가 정확히 동일하지 않습니까?

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

main(); 

그러나 다음 C 코드는 컴파일 오류를 발생시킵니다.

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

    printf("%d", i); 
} 

PHP의 변수는 엄격하게 블록 범위가 아닙니다. PHP에서는 내부 블록에 정의 된 변수를 외부 블록에서 사용할 수 있습니까?

+1

이 질문은 이미 답변 해 주셨습니다. –

+2

@Byron - 이것을 확인하고 싶습니다. PHP에서 C에서 온 사람은 나에게 이상합니다. – powerboy

+2

왜 downvoting? 나는 질문이 괜찮다고 생각한다. – Andrey

답변

45

PHP는 기능 범위 - 제어 구조가 if과 같은 새로운 범위를 도입하지 않습니다. 그러나 선언하지 않은 변수를 사용하더라도 신경 쓰지 않아도됩니다. $imain() 외부에 존재하지 않거나 if 문이 실패하더라도 여전히 자유롭게 에코 할 수 있습니다. 당신이주의 사항을 포함하는 PHP의 error_reporting은 설정이있는 경우 정의되지 않은 변수를 사용하려고하면

, 그것은 런타임에서 E_NOTICE 오류 을 방출합니다. 당신은 있었다 그래서 경우 :

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

코드는 잘 실행,하지만 일부 실행이 메아리 '3'합니다 (if이 성공하는 경우), 그리고 $i 정의되지 않으므로 일부는 E_NOTICE 및 에코 아무것도를 제기하지 않습니다 echo 문 범위에서.

함수 외부에서는 $i이 정의되지 않습니다 (함수의 범위가 다르기 때문에).

자세한 내용은 http://php.net/manual/en/language.variables.scope.php

+0

매우 철저한 설명으로 지식 공유 형태로 답변을 게시해야합니다 (답변을 게시해야 함). – powerboy

+2

좋은 설명! 그러나 당신이 무언가를 할 수 있다고해서 반드시해야한다는 것은 아닙니다. 정의되지 않은 변수를 사용하는 것은 나쁜 습관입니다. –

+0

아, 그리고 rand 호출의 결과가 0인지 확인하지 않아도됩니다. 당신은 간단하게 전에 rband를 넣을 수 있습니다 :) – peter