有人能請解釋原因的情況下「一」是永遠不會下面的代碼達到,爲什麼它會一直執行的情況下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請解釋爲什麼PHP開關的情況下總是處於代碼執行的情況下,0
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
PHP,如JavaScript或Perl,是一種鬆散類型的語言,並會嘗試猜你想要做什麼。在這種情況下,它將字符串更改爲可找到的最接近的整數,即零。換句話說,"a" == 0
在PHP中是一個真實的聲明。
有關此主題的更多信息,請參見PHP 。我建議你在switch
聲明中聲明值,或用if
/elseif
/else
結構替換它。
我鏈接了錯誤的例子... https://3v4l.org/tC3pt。從我可以告訴的情況來看,這不是那麼可預測的。 –
有趣的是,它似乎有時候是'select'中的值,它有時會變成'case'中的值。 – miken32
是的,這很奇怪。嘗試使'$ x =「0」的值;'......我可以看到它是錯誤的,但同時它是一個「0」的字面值,並且仍然支持「真實」情況。我認爲這可能與某些方面的排序有關,但我不能確定。 –
你可以在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;
}
?>
上情況下使用的可變型()應該是在開關中使用相同類型的()。
<?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;
}
這樣做的原因是因爲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;
}
開關不能在字符串和數字在同時使用[閱讀全文](http://php.net/manual/en/control-structures.switch.php#82351) – happymacarts
只是一個猜測,但某些開關值是整數,有些是串的事實可能會導致問題。 – John3136