2011-11-16 8 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 

その場合は、スイッチを満たし、したがって実行されます。非常に直感的ですが、PHPの型システムが動作する方法であり、残念ながら技術的にバグではありません。

あなたはこのような文字列に$iを回すことによってこの問題を解決することができます

switch ((string) $i) { 

それとも、できれば単なる文字列としてそれを初期化することにより:

$i = '0'; 
+0

これは知るのに非常に便利です。私はこの先月に遭遇し、それを解決したと思うが、私はそれをどう解決したか分からなかった。ありがとう! –

1

$ iは整数である、とあなたは文字列と比較しています。 PHPはその文字列( 'A')を整数に型キャストします。実際には0になりますので、PHPの土地では'A' == 0がTRUEです。

+0

あなたの答えをありがとう、あなたは正しいですが、ここで一番良い答えは残念です。 – Jasper

2

何が起こっているかは、(int)0が(string)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"; 
} 

?>