3

重複の可能性:
2 つの変数を比較すると偽の結果が返される

<?php
if( "32 is this a bug of php " == 32)
   echo "true";
else
   echo "false";
?>

出力は次のとおりです。

true

その出力はhttp://codepad.org/hgOisqZ8で確認でき ます

この条件が true と評価されるのはなぜですか?

4

5 に答える 5

7

型変換に関しては、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

于 2012-10-15T09:34:46.030 に答える
6

これについては、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
于 2012-10-15T09:35:40.827 に答える
5

比較演算子のドキュメントを参照してください:

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

いいえ、それはバグではなく、言語の設計方法です。

===タイプジャグリングをしたくない場合に使用します。

于 2012-10-15T09:35:48.903 に答える
2

注意のために、あなたはまた、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)
于 2012-10-15T09:47:31.380 に答える
1

このように使用することもできます

<?php
if( "32 is this a bug of php " == '32')
  echo "true";
else
  echo "false";
?>
于 2012-10-15T09:47:03.557 に答える