Blogブログ

PHP 緩やかな比較と厳密な比較について

こんにちは、HLCのサポート担当大谷です。
サポート業のかたわらPHPの修正等を担当しており、日々悪戦苦闘しつつ自分がつまづいた事柄などをご紹介しています。

以前、こんな記事をご紹介しました。
PHP if文の比較演算子について

前回のおさらいを3行にまとめると

  • ・ == は型までは確認しない。
  • ・ === は型まで確認する。
  • ・ == による比較では、一見falseとなると予想されるような比較でも、
  •   trueと判定される場合がある。
  •  

    このような内容でした。
    ただし、前回はNULL、””、0に限った範囲でのお話です。
    今回は、こちらに関係するお話の続きをご紹介します。

    緩やかな比較と厳密な比較

    PHPには「緩やかな比較」と「厳密な比較」があり、「厳密な比較」では型も同一であるかを比較し、判定します。
    対して「緩やかな比較」とは型変換の上で比較し、判定します。
    比較演算子 == が「緩やかな比較」、 === が「厳密な比較」にあたります。
     === は型も含めて比較するためシンプルですが、 == は色々と?な所があります。

    緩やかな比較

    緩やかな比較とは何?
    具体的にはphp.netにて公開されている、== による緩やかな比較表を見るのが手っ取り早いので、見てみましょう。

    これをわざわざ覚える必要はありませんが、== を使った比較で不可解な判定結果が返ってきた場合は、こちらを確認しましょう。

    上から順にざざっと確認してみます。
    trueの行では -1 や”-1″は結果がtrueで返されます。

  • ・true == -1
  • ・true == “-1”
  •  

    これらの式の結果はtrueなんですね。

    次に、falseの行では null、[]、””がtureとなっています。

  • ・false == null
  • ・false == []
  • ・false == “”
  •  

    これらの結果もtrueになります。

    また、PHP バージョン8.0.0で修正されたようですが、以前は文字列と0の比較結果はtrueが返されていました。

    ・0 == “hoge”; 

     

    これも、結果はtrueなんですよね。

    では、文字列でもこれはどうでしょうか。

  • ・1 == ‘hoge1’
  • ・1 == ‘1hoge’
  •  

    これ、上の式はfalse、下の式はtrueになります。

    なぜこんな事が起こるのか、== での場合は、比較前に型変換する事が原因のようです。
    型変換される際、文字列の先頭から文字を確認し、数値に変換できない文字が出てくるまでを数値として変換しているようです。
    先頭文字が数値に変換できない文字の場合は0に変換されているようです。
    上の行の右辺は0、下の行の右辺は1で判定されているんですね。

    少しの違いですが、これも仕様、という事です。
    8.0.0以前のシステムを触る時は気を付けましょう。

    あーこんなのあったなと覚えておけば、つまづかずに済みます。
    ささっと確認して解決してしまいましょう。

    ありがとうございました。

    大谷

    執筆者

    Developer

    大谷