記事一覧

PHP - 緩やかな比較 == と厳密な比較 ===



目次


はじめに

ハローみなさん。エジソンです。

みなさんは、PHPでたまに見かけるニクいやつ (===) を知っていますか?
(==)と似ているのですが、少し違う。そんな比較方式の違いについて、紹介しようと思います。

結論から言うと、『厳密な比較(===)の利用を推奨!』

するエントリです。

PHPにおける2種類の比較方式

PHPの比較には、2種類の方式があります。

それは、

緩やかな比較 == Loose comparison
厳密な比較 === Strict comparison

の2つです。

ソースを例示すると以下のようになります。

<?php
    $a = '1';
    // 緩やかな比較
    if ($a == 1) {
        echo '$a  == 1 : $aは1です。';
    } else {
        echo '$a  == 1 : $aは1ではないです。';
    }
    // 厳密な比較
    if ($a === 1) {
        echo '$a === 1 : $aは1です。';
    } else {
        echo '$a === 1 : $aは1ではないです。';
    }
?>

結果:
$a  == 1 : $aは1です。
$a === 1 : $aは1ではないです。

上記の結果からわかる通り、どちらも $a は1のはずなんですが、厳密な比較においては、

$a === 1 : $aは1ではないです。

との結果が出力されます。

なぜ、こんな結果が導かれたかというと、表面的にはPHPには型がないように見えるのですが、実は内部では型情報を保持しており、比較などを行うにあたり自動的に型変換しているのです。したがって、以下の2つは似ているようで、違うのです。

    $a = '1'; // 文字列として代入(シングルクォートがあると文字列)
    $a = 1; // 数値として代入
    

    緩やかに比較するということは、型を自動変換して比較してくれるということで、一方で、厳密に比較するということは型が一致していることを前提にして比較を行うということなのです。

    何故、比較方式が2種類存在するのか?

    緩やかな比較と、厳密な比較の2種類の方式があるというのは、CやJava言語などのコンパイラ言語に類を見ない言語仕様ということで、プログラマを迷わせてしまう、一見して曖昧で不誠実な言語仕様のように感じてしまうのですが、これは何よりPHPというスクリプト言語だからこそ生まれた考え方だと、言えるように思えます。

    PHPは、簡単に記述的て実行も簡単にできるのが、最大のウリとも言えます。そのため、型という概念を敢えて排除しています。型という概念を排除するということは、比較においても型を意識せずに比較できなければなりません。

    よって、『(==)で比較するときは、自動で型変換してあげるね』という言語仕様に帰結するわけです。

    ですが、やっぱり型も意識して厳密に比較したくなる場合もあるはずです。そういったケースに対応するために、厳密な比較(===)が用意されているのです。

    厳密な比較を推奨

    僕の考えとして、エンタープライズ向けのコードにおいては、厳密な比較(===)を推奨します。

    厳密な比較を推奨する理由としては以下が挙げられます。

    1. 厳密な比較(===)を用いたほうがパフォーマンス的に有利
      緩やかな比較の場合には、自動的に型変換が発生してしまうので、パフォーマンス効率が悪いです。考えてみれば、当たり前のことですね。


    2. 予期せぬ誤動作を避ける
      例として、パスワード変更時に新しいパスワードと確認用項目の同一性チェックが挙げられます。数値が入力された状態で、緩やかな比較を用いると、不当にチェックを通過してしまうことがあるのですね(以下のコード例では、ifブロックが実行されてしまいます)。

          // $password と $passwordConfirm が画面から入力された値と仮定します!
          $password = '1.0'; // 画面から入力された値
          $passwordConfirm = '1'; // 画面から入力された値
          if ($password == $passwordConfirm) {
              echo '文字比較なのに同じ値として認識されてしまう!';
          }
      

    以上の理由から、厳密な比較を推奨します。もし、どうしても型が一致しない場合には、キャストなどを利用して型を変換してから、厳密な比較に臨みましょう。

    <?php
        $a = '1'; // 文字列として代入
        if ( (int) $a === 1) {
            echo ' (int) $a === 1 : $a は 1です。';
        }
    ?>
    

    IDEによっては、曖昧な比較を利用した際に、警告が発生するように設定することも可能です。

    NetBeansでは、この設定がデフォルトでONになっているようです。是非、IDEなどのツールを生かして、曖昧な比較を排除して、厳密な比較を自然に強制できるようにしたら良いかと思います。

    ちなみに、不一致の比較の場合には、(!=)か(!==)を利用してください。

    参考サイト
    http://wp.tech-style.info/archives/123
    http://php.net/manual/ja/types.comparisons.php
    関連記事

    このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp