2011-08-14 2 views
1

다른 것을 기대하고 있었기 때문에 누군가 내가 왜 다음과 같은 결과를 얻었는지에 대한 단서가 있기를 바랬습니다.php의 스위치 조건에 관한 질문들

$x = NULL; 
switch ($x) { 
    case "0": 
     echo "String"; 
     break; 
    case 0: 
     echo "Integer"; 
     break; 
    case NULL: 
     echo "NULL"; 
     break; 
    case FALSE: 
     echo "Boolean"; 
     break; 
    case "": 
     echo "Empty string"; 
     break; 
    default: 
     echo "Something else"; 
     break; 
} 
// outputs "Integer" was expecting "NULL" 

$x=6; 
switch ($x) { 
    case "6b": 
     echo "6b"; 
     break; 
    case "6": 
     echo "6 empty"; 
     break; 
    case 6: 
     echo "6 full"; 
     break; 
    default: 
     echo "6 half"; 
     break; 
} 
// outputs "6b" was expecting "6 empty" 

답변

5

says 수동 :

참고 전환하는 것이/케이스 느슨한을 비교 한 않습니다.

처음 문자열 "0" 아니므로 NULL 거짓 인 NULL == "0" 여부를 확인합니다.

NULL (정수는 0)이므로 Integer가 인쇄됩니다.

6의 경우, 정수로 변환합니다. "6b"6이됩니다. 스위치/케이스 수행

NULL != "0"; 
NULL == 0; 

"6b" == 6; 
1

$ X가 자동으로 정수로 변환됩니다 수행하십시오. 대신 if/else if 구조체를 사용하고 $x === 0을 사용하여 비교할 수 있습니다. ===은 "엄격하게"와 같은 뜻입니다.

2

비교 유형의 jugling에서 작동합니다 때문에

는 그래서입니다.

기본적으로 == 연산자를 사용하며 === 연산자는 사용하지 않습니다. 당신이 문자열로 숫자를 비교하거나 비교가 숫자 문자열, 각 문자열을 숫자로 변환하고 비교 수치 수행을 포함하는 경우

: Comparison Operators을 인용


.
이 규칙은 스위치 문에도 적용됩니다.

+0

네 말이 맞지만 잘못된 단락을 인용 한 것 같아. 문제의 비교는 문자열을 전혀 포함하지 않습니다. –

+0

적어도 OP의 두 번째 예에는 문자열, 정수 및 숫자 문자열 *이 있습니다 (첫 번째 문자열에는 그다지 중요하지 않습니다). –

+0

아, 두 번째 문자열이 있습니다. 와우, 무슨 불친절한 질문>. < –