2011-11-16 96 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中發現了一個bug,你沒有,它是一個錯誤,誤解你的代碼。 – 2011-11-16 04:01:57

+0

我想我已經明白了,謝謝大家。 – Jasper

回答

9

這種比較是發生:

0 == 'A' 

什麼情況是,PHP鑄字符串爲整數。這導致字母A變成零,因爲它不代表數字。

因此:

0 == 0 

而且這種情況下,滿足了開關,因此被執行。非常直觀,但它是PHP的類型系統的工作方式,不幸的是技術上不是bug。僅通過初始化它作爲一個字符串,如果你能

switch ((string) $i) { 

或者:

您可以通過轉動$i成字符串像這樣解決這個

$i = '0'; 
+0

這非常有用。我想我上個月遇到了這個問題並解決了這個問題,但我不確定*我如何解決它。謝謝! –

1

$ i是一個整數,你正在比較一個字符串。 PHP會將該字符串('A')轉換爲一個整數,這使得它實際上也是0,因此,在PHP-land中,'A' == 0爲真。

+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"; 
} 

?>