bugfix> php > 投稿

私は記事を読んでいて、この例を見つけました:

// Prints bool(true)
var_dump('9223372036854775807' == '9223372036854775808');
// Prints bool(false)
var_dump('9223372036854775807' ==='9223372036854775808');

誰でも理由を説明できますか?

回答 4 件
  • redditとphpバグレポートから。

    ここでいくつかのことが起こっています。

    ==  値が異なるタイプの場合、falseを返しません。この場合、PHPは文字列をフロートに変換して数値を比較します。サイズとPHPがフロートを処理する方法により、同じ数値に丸められます。したがって、2つのストリングを同じ数値として比較します。

    ===  強制タイプは同じでなければなりません。したがって、これら2つを文字列として比較すると、それらは同じではありません。

    @Classifiedが別のコメントで述べたように、これはphp 5.4.4で修正されたため、現在のバグではありません。

  • 両方のケースが返されるはずです 数字が違うからですが、あなたの疑問は'の違い=='および'===' そして最初のケースが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のサポート終了チャートをご覧ください。

あなたの答え