2017-01-12 63 views
5

有人能請解釋原因的情況下「一」是永遠不會下面的代碼達到,爲什麼它會一直執行的情況下0請解釋爲什麼PHP開關的情況下總是處於代碼執行的情況下,0

switch ("a") { 
case 0: 
    echo "0"; 
    break; 
case "a": // never reached because "a" is already matched with 0 
    echo "a"; 
    break; 
} 
+0

開關不能在字符串和數字在同時使用[閱讀全文](http://php.net/manual/en/control-structures.switch.php#82351) – happymacarts

+0

只是一個猜測,但某些開關值是整數,有些是串的事實可能會導致問題。 – John3136

回答

3

PHP,如JavaScript或Perl,是一種鬆散類型的語言,並會嘗試猜你想要做什麼。在這種情況下,它將字符串更改爲可找到的最接近的整數,即零。換句話說,"a" == 0在PHP中是一個真實的聲明。

有關此主題的更多信息,請參見PHP 。我建議你在switch聲明中聲明值,或用if/elseif/else結構替換它。

+1

我鏈接了錯誤的例子... https://3v4l.org/tC3pt。從我可以告訴的情況來看,這不是那麼可預測的。 –

+0

有趣的是,它似乎有時候是'select'中的值,它有時會變成'case'中的值。 – miken32

+0

是的,這很奇怪。嘗試使'$ x =「0」的值;'......我可以看到它是錯誤的,但同時它是一個「0」的字面值,並且仍然支持「真實」情況。我認爲這可能與某些方面的排序有關,但我不能確定。 –

2

你可以在switch語句中沒有使用混合用例,因爲PHP會解釋你的意思。通過外行人的說法,它會嘗試找到未定義給處理器的''值',因此在這種情況下爲0。

相同將去下面的代碼:

<?php 

$x = "a"; 
switch($x) 
{ 
    case "c": 
     echo "c"; 
    break; 

    case 1: 
     echo "1"; 
    break; 

    case 0: 
     echo "0"; 
    break; 

    case "a": 
     echo "a"; 
    break; 

    case false: 
     echo "false"; 
    break; 

    default: 
     echo "def"; 
    break; 
} 

?> 

Documentation is available at PHP.net

1

上情況下使用的可變型()應該是在開關中使用相同類型的()。

<?php 
    switch ("a") { 
     case "0": 
      echo "0"; 
      break; 
     case "a": // never reached because "a" is already matched with 0 
      echo "a"; 
      break; 
    } 

對於整數類型:

<?php 
switch (1) { 
    case 0: 
    echo 0; 
    break; 
    case 1: // never reached because "a" is already matched with 0 
    echo 1; 
    break; 
} 
1

這樣做的原因是因爲switch使用loose comparison==

這就是說:

if ("a" == 0) // TRUE 
if ("a" == true) // TRUE 

幾乎任何人會評估爲false。 ("a" == "a"除外)

因此,如果您需要對字符串和整數進行比較,則應將其轉換爲字符串進行比較。

//$var = "a"; 
$var = 0; 

$var = strval($var); 
switch ($var) { 
    case '0': 
     echo "0"; 
     break; 
    case 'a': 
     echo "a"; 
     break; 
}