5

スイッチ パラメータとして整数 0 を指定すると、最初の結果「foo」が取得されます。

$data=0; // $data is usually coming from somewhere else, set to 0 here to show the problem
switch ($data) :
    case "anything":
        echo "foo";
        break;
    case 0:
        echo "zero";
        break;
    default: 
        echo "bar";
endswitch;

これをどのように変更すれば、スイッチは期待どおりに「ゼロ」を書き込みますか?

4

3 に答える 3

7

switch/case ステートメントは緩やかな比較を使用しており、好むと好まざるとにかかわらず、次のようになり0 == "anything"ますtrue

比較演算子

[...] 数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。これらの規則は、switch ステートメントにも適用されます。[...]

var_dump(0 == "a"); // 0 == 0 -> true

1 つの解決策は、すべての case ステートメントを文字列に変更し、文字列比較を行うことです。

$data = 0;
switch ((string) $data): ## <- changed this
    case "anything":
        echo "foo";
        break;
    case "0":            ## <- and this
        echo "zero";
        break;
    default: 
        echo "bar";
endswitch;
于 2013-11-11T08:27:48.287 に答える
2

Switch/case ステートメントは「緩い比較」を使用します (つまり==、この場合、0も意味falseし、1も意味しtrueます。( http://www.php.net/manual/en/types.comparisons.php#types.comparisons-loose )

この問題を回避するには、次の 2 つの解決策があります。

1) @zzlalani の提案に従って、引用符を追加します。

   case '0': ...

2) switch ステートメントを明示的にキャストして、厳密な比較を強制する ( ===)

    switch((string)($data)) { ... }
于 2013-11-11T09:15:18.433 に答える
1

このようにしてください

$data=0;
switch ($data)
{
    case 0:
        echo "bar";
        break;
    default: 
        echo "foo";
    break;
}

編集 :

これをどのように変更すれば、スイッチは期待どおりに「ゼロ」を書き込みますか?

ケースステートメントを上に移動する必要があります。

$data=0;
switch ($data) :
    case 0:            // Moved this case to the begining
        echo "zero";
        break;

    case "anything":
        echo "foo";
        break;
    default: 
        echo "bar";
endswitch;

これは、「 strict-type」チェックをswitch行わないためです。

于 2013-11-11T07:54:17.127 に答える