1

私は比較「エラー」とかなり混乱しています。この比較をコーディングした方法では、ユーザーが0または1以外の値(または値なし)を入力した場合、結果が0になるようにします。

session_start();
function test( $status = 0 ) {
        if( !isset($_SESSION['status']) ) { $_SESSION['status'] = 0; }
        else {
            switch( $status ) {
                case 0: $_SESSION['status'] = $status;
                break;

                case 1: $_SESSION['status'] = $status;
                break;

                default:
                $_SESSION['status'] = 0; 
                $status = 0;
            }
        }
        echo 'Variable value: ' . $status;
        echo ' | Session value: ' . $_SESSION['status'] . "<br/>";
}
test();
test(0);
test(1);
test(999);
test('ready');

ただし、 RATHER THANtest('ready');を出力するため、で壊れます。数値を文字列と比較している場合でも、引き続き正常に機能する(そして実行する)必要があります。Variable value: ready | Session value: readyVariable value: 0 | Session value: 0case o:

ところで:私が置き換えても結果は同じswitchですif( $status ===

===編集:2012年12月19日=== @ bryan-b@jatochnietdanのコメントと回答に
感謝します: if(0 =='string')-Because a string (when compaired with numbers [] ) is compared as 0

それは私が問題を理解するのを助け、他の言語とは異なり、それらは異なるデータ型であるため、比較で自動的にfalseを返すのではなく、それを学びました。phpは、数値と比較したときに値が0であるかのように文字列変数を比較します。それは注意すべきことです。

これは修正された(動作している)コードです:

session_start();
function test( $status = 0 ) {
        if( !isset($_SESSION['status']) ) { $_SESSION['status'] = 0; }
        else {
            switch( $status ) {
                case 1: $_SESSION['status'] = $status;
                break;

                default:
                $_SESSION['status'] = 0; 
                $status = 0;
            }
        }
        echo 'Variable value: ' . $status;
        echo ' | Session value: ' . $_SESSION['status'] . "<br/>";
}
test();
test(0);
test(1);
test(999);
test('ready');

@bryan-b@jatochnietdanに感謝します!!!

PS。2つの答えに投票できたらいいのにと思います。

4

4 に答える 4

5

$ _SESSION ['status']の値が1以外のいずれかが入力された場合に0になることだけが本当に必要な場合は、これで十分です。

function test( $status = 0 ) {
    $_SESSION['status'] = ($status == 1 ? 1 : 0);
}

テストでは、値は次のようになります。

Session value: 0
Session value: 0
Session value: 1
Session value: 0
Session value: 0

編集:わずかな間違いを修正しました。デフォルトは1でしたが、デフォルトは0にしたいと思います。

コードに関しては、「ready」と表示される理由は、ケース0の場合は$ _SESSION['status']を$statusに設定しており、その場合は$statusに「ready」が含まれているためです。$ _SESSION ['status'] = 0を実行するだけで、これを修正できます。

于 2012-12-19T23:07:38.003 に答える
3

ここでの問題は、phpが文字列 "ready"を整数にキャストしているため、大文字と小文字の比較が機能することだと思います。phpドキュメント(http://php.net/manual/en/function.intval.php)から:

文字列はほとんどの場合0を返しますが、これは文字列の左端の文字によって異なります。整数キャストの一般的なルールが適用されます。

(動作中の)関数にエコーを追加して、スイッチの比較のために文字列をintにキャストするときにphpが何をしているかを示します。渡されたステータスの正確な値とタイプを確認する必要があります。

function test($status = 0){
    if(!isset($_SESSION['status']) || $status !== 1){ 
        $_SESSION['status'] = 0; 
    }
    else {
        $_SESSION['status'] = 1;
    }

    echo 'Variable value: ' . $status;
    echo ' | Variable value (int): ' . (int)$status;
    echo ' | Session value: ' . $_SESSION['status'] . "<br/>";
}
test();
test(0);
test(1);
test(999);
test('ready');
于 2012-12-19T23:05:04.467 に答える
1

これは、phpのスイッチが緩い比較と呼ばれるものを使用しているために発生します。

つまり、文字列"value"はに評価されるため、ご想像の0とおりデフォルトに達することはありません。

于 2012-12-19T23:11:28.203 に答える
0

PHPは大まかに型付けされており、文字列入力は比較のために整数として評価できます(実際、コードではこれに少し依存していると思います)。

数値以外の文字を含む文字列は整数0として評価されます。したがって、switchステートメントのケースは0から「ready」に0から「0」および1から「1」と同じくらい簡単に一致します。

だから-あなたはただすることができます:

$_SESSION['status'] = 0;
if ($status == 1) {
  $_SESSION['status'] = 1;
}

または、ctype関数を使用して、文字列内の数値を検出します。

于 2012-12-20T00:05:41.740 に答える