重複の可能性:
2 つの変数を比較すると偽の結果が返される
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
出力は次のとおりです。
true
その出力はhttp://codepad.org/hgOisqZ8で確認でき ます
この条件が true と評価されるのはなぜですか?
重複の可能性:
2 つの変数を比較すると偽の結果が返される
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
出力は次のとおりです。
true
その出力はhttp://codepad.org/hgOisqZ8で確認でき ます
この条件が true と評価されるのはなぜですか?
型変換に関しては、PHP は非常に愚かだからです。
この式は、最初に "32 is this a bug of php" を整数にキャストすることによって評価され、結果は 32 になります。その後、比較の結果は true になります。
タイプセーフな比較を行いたい場合は === 演算子を使用します
<?php
if( "32 is this a bug of php " === 32)
echo "true";
else
echo "false";
?>
出力は false になります。
=== 演算子があることに注意してください。これは"32" !== 32
、1 つの変数がstring
他の変数がint
これについては、PHP マニュアルで説明されています。
数値への文字列変換
文字列が数値コンテキストで評価されると、結果の値と型は次のように決定されます。
文字列に '.'、'e'、または 'E' のいずれかが含まれている場合、文字列は float として評価されます。それ以外の場合は、整数として評価されます。
値は文字列の最初の部分によって与えられます。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合、値は 0 (ゼロ) になります。有効な数値データは、オプションの符号であり、その後に 1 つ以上の数字 (オプションで小数点を含む) が続き、その後にオプションの指数が続きます。指数は、'e' または 'E' の後に 1 つ以上の数字が続きます。
と書かれている部分に注意
文字列が有効な数値データで始まる場合、これが使用される値になります。
文字列が PHP で始まるため、どちらが真であるか32
が比較if(32 == 32)
されます。
この動作が望ましくない場合は、データ型が異なる可能性がある型を処理するときに、データ型を考慮した型安全チェックを使用します。お気に入り
1 === 1: true
1 == 1: true
1 === "1": false
1 == "1": true
"foo" === "foo": true
比較演算子のドキュメントを参照してください:
数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。
いいえ、それはバグではなく、言語の設計方法です。
===
タイプジャグリングをしたくない場合に使用します。
注意のために、あなたはまた、phpで$a==$b && $b==$c
意味しないこと を知る必要があります。$a == $c
例:
var_dump('32E0' == '32');
var_dump('32' == 32);
var_dump(32 == '32 is a bug');
var_dump('32E0' == '32 is a bug');
出力は次のとおりです。
bool(true)
bool(true)
bool(true)
bool(false)
このように使用することもできます
<?php
if( "32 is this a bug of php " == '32')
echo "true";
else
echo "false";
?>