スクリプトをデバッグしていたところ、if ステートメントが期待どおりに機能していないことがわかりました。
var_dump("6064365413078728979" == "6064365413078728452");
die();
上記のコードは、次のようになります。
bool(true)
=== 演算子を使用すると、期待どおりに機能します。誰でも理由がわかりますか?
x64 WindowsマシンにワンプをインストールしてPHPバージョン5.3.13を使用しています。
スクリプトをデバッグしていたところ、if ステートメントが期待どおりに機能していないことがわかりました。
var_dump("6064365413078728979" == "6064365413078728452");
die();
上記のコードは、次のようになります。
bool(true)
=== 演算子を使用すると、期待どおりに機能します。誰でも理由がわかりますか?
x64 WindowsマシンにワンプをインストールしてPHPバージョン5.3.13を使用しています。
==
PHPの型比較動作は緩いため、厳密でない比較の前に数値文字列が整数型に変換され、変換結果がオーバーフローします。
それが可能な場合に使用する主な理由===
です。
型ジャグリングの詳細については、このページを参照してください。
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>
それを実行すると、マシンで数値の制限を超えている可能性があり、数値比較が行われます。上記のスクリプトを試してみて、$a の値がおそらく指定した値と異なることを確認してください。
そのため、両者を数値的に比較すると、両者は等しいのです。したがって 、他の人が提案したように===を使用してください
編集:@Axelのアドバイスに基づく説明。
float のサイズはプラットフォームに依存しますが、一般的な値は約 14 桁の精度で最大 ~1.8e308 です (64 ビット IEEE 形式)。
また、この Web サイトでは、オーバーフロー現象と、システムの整数と浮動小数点の範囲をテストするための小さな PHP コードを提供および説明しています。サーバーの制限を知ることは、おそらくオファーフローが発生した理由を最もよく説明するでしょう