2011-11-16 4 views
2

대답을 알고 싶습니다. 다음 코드가 인쇄되지 않는 이유는 무엇입니까?PHP switch 문이 버그입니까?

$i = 0; 
switch ($i) { 
    case 'A': 
     echo "i equals A"; //will printed it 
     break; 
    case 'B': 
     echo "i equals B"; 
     break; 
    case 'C': 
     echo "i equals C"; 
     break; 
    default: 
     echo "i equals other"; 
} 

누구나 그 이유를 말할 수 있습니까? 나는 진정으로 이해하지 못한다. 내 PHP 버전은 5.2.17 Theanks입니다.

+3

99.999999999999999999 % 당신이 PHP에서 버그를 발견 한 생각한다면, 당신은 당신의 코드에서의 버그 \ 오해를하지 않았습니다. –

+0

나는 이미 이해했다고 생각합니다 모두에게 감사드립니다. – Jasper

답변

9

이 비교는 무슨 일이 일어나고 :

0 == 'A' 

은 무슨 일 PHP는 문자열을 정수로 캐스트이다. 문자 A가 숫자가 아니기 때문에 0이됩니다. 따라서

:

0 == 0 

그 경우는 스위치를 만족하고, 따라서 실행된다. 매우 반 직관적이지만 PHP의 유형 시스템이 작동하는 방식이며, 불행히도 기술적으로 버그는 아닙니다. 할 수 있다면 그냥 문자열로 초기화하여

switch ((string) $i) { 

또는를 :

이 같은 문자열로 $i를 설정하여이 문제를 해결할 수

$i = '0'; 
+0

이것은 매우 유용합니다. 나는 지난 달에 부딪쳐 해결했다고 생각하지만, 어떻게 해결했는지 확신 할 수 없었다. 감사! –

1

$ i가 정수이고, 당신은 문자열과 비교하고 있습니다. PHP는 해당 문자열 ('A')을 정수로 변환하여 실제로 0이되도록합니다. 그렇기 때문에 PHP의 경우 'A' == 0이 TRUE입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 여기에있는 유일한 답변은 유감입니다. – Jasper

2

(int) 0은 (문자열) A와 같습니다.

$i = 0;$i = '0';으로 변경하면 올바르게 작동합니다.

0

이 work.You이 경우에 스위치 케이스와 같은 문자열에 변환해야한다을; 시간의

<? 
$i = 0; 
$i = (string)$i; 
switch ($i) { 
    case 'A': 
     echo "i equals A"; //will printed it 
     break; 
    case 'B': 
     echo "i equals B"; 
     break; 
    case 'C': 
     echo "i equals C"; 
     break; 
    default: 
     echo "i equals other"; 
} 

?> 
관련 문제