0
if ("false" == 0) echo "true\n";
// => true

PHPのドキュメントには次のように書かれています。

var_dump((bool) "false");   // bool(true)

バグの場合、どこに提出できますか?

4

4 に答える 4

7

いいえ、バグではありません。わざわざ提出しないでください。

この一見一貫性のない動作は、「false」という言葉とは何の関係もありません。これは、文字のみで構成され、数字を含まない文字列と関係があるため、比較のために整数にキャストされると(== 0)、結果は0になり、0 == 0trueと評価されます。

他のアルファベット文字列を0と比較すると、同じ結果が得られます。

"abcd" == 0
"a" == 0
"true" == 0
于 2012-05-26T14:56:07.817 に答える
5

これはバグではなく、さまざまなデータ型(この場合は文字列と整数)の値を比較するときに十分に文書化された機能です。PHPは文字列を整数に変換して比較を行い、「false」は0に変換します。

マニュアルを参照してください:

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

文字列から数値への変換に関するこのページ

文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は0(ゼロ)になります。

この動作を回避するには、厳密な型指定との比較を使用します。

if ("false" === 0) echo "true\n";
于 2012-05-26T14:56:40.460 に答える
0

問題は、厳密な比較を使用しない限り、PHPが変数をキャストすることです。他の人が述べたように、文字列"false"は整数にキャストされています。

型キャストを使用せずに比較を行う場合:

"false" === 0
于 2012-05-26T15:05:02.343 に答える
0

これは役立つかもしれません:PHPがfalseと見なすのはこれらだけです:

  • 実際のブール値false
  • NULL値(空)
  • 整数0
  • テキストの文字列比較を避け、ブール値に固執するようにしてください!

    于 2012-05-26T18:23:11.500 に答える