2

これは絶対的な狂気です。今日、常に単一の文字に評価されるはずの投稿変数をテストしていました。サンプルコードは...

if($_POST['status'] == '' || $_POST['status'] == 0){ die('oh no!'); }

P のステータスを渡すと、die ステートメントを実行していました。次に、次のコードで PHP ファイルを作成しました...

echo 'P1: '.intval($_POST['status']=='').'<br />';
echo 'P2: '.intval($_POST['status']==0).'<br />';
echo 'P3: '.intval('P'==0).'<br />';

何だと思う?P2 と P3 は両方とも TRUE と評価されます。intval は、P1 に何も表示しないのではなく、0 を表示するためだけに存在します。

これは PHP の既知のバグですか? これは、私が実行しているバージョンで壊れているだけですか? 率直に言って、なぜこれを行っているのか、私は完全に途方に暮れています。トリプルイコールを使用して正しく評価されますが、ダブルでは評価されません。私の本では、Pは間違いなく0に等しくありません...

4

3 に答える 3

10

PHPドキュメントから:

数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。

于 2013-01-23T18:40:35.250 に答える
1

比較のphpマニュアルを読んでください。http://php.net/manual/en/language.operators.comparison.php

数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。

変換を行いたくない場合は、トリプルイコールを使用する必要があります。

$a === $b

$a が $b と等しく、それらが同じ型である場合は TRUE

どこ$a == $b

$a が $b と等しく、それらが同じ型である場合に TRUE。

.

于 2013-01-23T18:41:45.097 に答える
1

を使用して文字列と数値を比較すると==、PHP はその文字列を数値に変換します。

文字列'P'に数字が含まれていません。したがって、PHP はこれを number と評価します0。最後に0 == 0、これはtrueです。

一方、トリプル イコール ( ===) を使用すると、前述の変換は行われません。PHP は、それらのタイプも一致することを期待しています。1 つは文字列、もう 1 つは数値であるため、 を返しますfalse

于 2013-01-23T18:46:42.620 に答える