if ("false" == 0) echo "true\n";
// => true
PHPのドキュメントには次のように書かれています。
var_dump((bool) "false"); // bool(true)
バグの場合、どこに提出できますか?
if ("false" == 0) echo "true\n";
// => true
PHPのドキュメントには次のように書かれています。
var_dump((bool) "false"); // bool(true)
バグの場合、どこに提出できますか?
いいえ、バグではありません。わざわざ提出しないでください。
この一見一貫性のない動作は、「false」という言葉とは何の関係もありません。これは、文字のみで構成され、数字を含まない文字列と関係があるため、比較のために整数にキャストされると(== 0
)、結果は0になり、0 == 0
trueと評価されます。
他のアルファベット文字列を0と比較すると、同じ結果が得られます。
"abcd" == 0
"a" == 0
"true" == 0
これはバグではなく、さまざまなデータ型(この場合は文字列と整数)の値を比較するときに十分に文書化された機能です。PHPは文字列を整数に変換して比較を行い、「false」は0に変換します。
マニュアルを参照してください:
数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、比較は数値的に実行されます。
文字列から数値への変換に関するこのページ
文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は0(ゼロ)になります。
この動作を回避するには、厳密な型指定との比較を使用します。
if ("false" === 0) echo "true\n";
問題は、厳密な比較を使用しない限り、PHPが変数をキャストすることです。他の人が述べたように、文字列"false"
は整数にキャストされています。
型キャストを使用せずに比較を行う場合:
"false" === 0
これは役立つかもしれません:PHPがfalseと見なすのはこれらだけです:
テキストの文字列比較を避け、ブール値に固執するようにしてください!