私は記事を読んでいて、この例を見つけました:
// Prints bool(true)
var_dump('9223372036854775807' == '9223372036854775808');
// Prints bool(false)
var_dump('9223372036854775807' ==='9223372036854775808');
誰でも理由を説明できますか?
両方のケースが返されるはずです偽 数字が違うからですが、あなたの疑問は'の違い=='および'===' そして最初のケースがtrueを返す理由 正しい ?
「=='値が等しいかどうかを比較しています前 タイプジャグリング、「==='値が等しいかどうかを比較しています後 タイプジャグリング。 言い換えると、「=='あなたが比較している場合値は等しい、しかし、あなたが使用しているとき==='あなたが比較している場合値と型は等しい。
これらの場合、両方の比較は偽 値が異なるためですが、最初の比較についてTRUE、https://bugs.php.net/bug.php?id = 54547で見ることができるように、PHPのバグです。
PS:9223372036854775807 より大きい整数ですので、型をチェックする場合gettype()、表示されます:
9223372036854775807 は整数。
9223372036854775808 はダブル。As of PHP 5.4.4 this is no longer an issue.
これが起こっている理由は、タイプジャグリングのためです。最初の例では、2つの値が等しいかどうかを確認しています後 タイプジャグリングは非常に効果的に、2つの文字列タイプを比較します。
そして、他の例では、同じタイプと正確な 同じ値。
これをチェックして。
<?php var_dump('9223372036854775807' == '9223372036854775808'); var_dump('9223372036854775807' ==='9223372036854775808');
出力:
bool(false) bool(false)
そうではありません。 https://3v4l.org/4oHvoの証拠については、上記の正確なコードをここで実行してください
UPDATE:
以下のコメントに基づいて、質問している人は、4年前にサポートされなくなったバージョンのPHPを使用しており、セキュリティ上の欠陥に対して脆弱である可能性があるようです。 PHPを更新してください!
php.net https://secure.php.net/eol.phpのサポート終了チャートをご覧ください。
redditとphpバグレポートから。
ここでいくつかのことが起こっています。
==
値が異なるタイプの場合、falseを返しません。この場合、PHPは文字列をフロートに変換して数値を比較します。サイズとPHPがフロートを処理する方法により、同じ数値に丸められます。したがって、2つのストリングを同じ数値として比較します。===
強制タイプは同じでなければなりません。したがって、これら2つを文字列として比較すると、それらは同じではありません。@Classifiedが別のコメントで述べたように、これはphp 5.4.4で修正されたため、現在のバグではありません。