PHPでプログラムを開発する際、条件分岐は避けて通れない非常に重要な要素です。

その中でも「値が等しくないこと」を判定する比較演算子は、ループの終了条件やバリデーションなど、多くの場面で使用されます。

PHPにはノットイコールを示す演算子が複数存在しており、それぞれの動作の違いを正しく理解していないと思わぬバグを招く可能性があります。

本記事では、PHPにおけるノットイコール演算子の種類と、それらの使い分けについて詳しく解説します。

PHPにおけるノットイコール演算子の種類

PHPで「等しくない」を表現する演算子には、主に3つの書き方があります。

一般的に広く使われるのは !=!== ですが、実はもう一つ別の書き方も存在します。

等価演算子(!=)

!= は「等価演算子」の否定形として機能します。

この演算子は、比較する2つの値が「型変換(型キャスト)を行った結果、等しくない場合」true を返します。

PHPの特徴的な機能である「動的型付け」により、数値と文字列を比較する際に自動的に型が調整されるのが特徴です。

不等演算子(<>)

<>!= と全く同じ動作をする演算子です。

基本的な挙動は != と変わりませんが、他のプログラミング言語(SQLやVisual Basicなど)に慣れている開発者が使いやすいように用意されています。

現代のPHP開発においては、慣習的に != が使われることが一般的です。

厳密な不等演算子(!==)

!== は「厳密な比較」を行うための演算子です。

この演算子は、比較する2つの値が「値が異なる」または「データ型が異なる」場合に true を返します。

自動的な型変換が行われないため、予期せぬ判定ミスを防ぐための重要なツールとなります。

!=(等価演算子)の挙動と注意点

!= を使用する場合、PHPは内部で型を合わせようと試みます。

例えば、数値の 0 と文字列の "0" を比較した場合、PHPはこれらを「等しい」とみなします。

したがって、0 != "0" という式の結果は false になります。

PHP
<?php
$num = 0;
$str = "0";

if ($num != $str) {
    echo "等しくありません";
} else {
    echo "等しいと判定されました";
}
?>
実行結果
等しいと判定されました

このように、データの型が異なっていても内容が同じであれば等しいと判定されるのが != の性質です。

しかし、この挙動は時として危険な挙動を引き起こします。

例えば、空文字列 "" と数値の 0、あるいは nullfalse などを比較した際にも、意図せず「等しい」と判定されてしまうことがあるからです。

!==(厳密な不等演算子)を使うべき理由

現代的なPHP開発において、特別な理由がない限りは !== を使用することが推奨されます。

!== を使うことで、値だけでなく「型」も厳密にチェックできるため、コードの可読性と安全性が向上します。

PHP
<?php
$num = 0;
$str = "0";

if ($num !== $str) {
    echo "型または値が異なるため、等しくないと判定されました";
}
?>
実行結果
型または値が異なるため、等しくないと判定されました

このコードでは、一方は int 型(整数)、もう一方は string 型(文字列)であるため、!== は「これらは別物である」と正しく判断します。

特に、関数の戻り値として「成功時は数値、失敗時は false」が返ってくるようなケースでは、!== によるチェックが不可欠です。

例えば strpos 関数のように、見つかった位置が 0(先頭)の場合と、見つからなかった場合の false を区別するには、厳密な比較が必須となります。

演算子による比較結果の違い一覧表

以下に、代表的な値の組み合わせにおける !=!== の判定結果の違いをまとめました。

比較する値 A比較する値 BA != B の結果A !== B の結果
11falsefalse
1“1”falsetrue
0falsefalsetrue
0“”falsetrue
nullfalsefalsetrue
12truetrue

この表から分かる通り、!= は柔軟に型を変換してくれますが、その分だけ 「本来は別物であるはずのもの」を同じとみなしてしまうリスク があります。

対して !== は、データの性質を正確に反映した判定を行っていることがわかります。

PHPの比較でよくある失敗例

開発現場でよく見かける間違いの一つに、null0 の扱いがあります。

例えば、ユーザーIDが 0 である可能性のあるシステムで、以下のようなコードを書いたとしましょう。

PHP
<?php
$userId = 0; // システム上、IDが0のユーザーが存在すると仮定

if ($userId != null) {
    echo "有効なユーザーです";
} else {
    echo "ユーザーIDが指定されていません";
}
?>
実行結果
ユーザーIDが指定されていません

この場合、$userId0 が入っているにもかかわらず、!= null の判定で false(=等しい)となってしまい、エラー扱いされてしまいます。

これは 0 == nulltrue と評価される PHP の型変換仕様によるものです。

このようなバグを防ぐためには、必ず !== null を使用して、型を含めた厳密なチェックを行うべきです。

型安全なプログラミングへの意識

近年のPHPは、型宣言(タイプヒンティング)の強化など、より厳密な言語へと進化しています。

そのため、演算子についても 「曖昧な比較を避ける」 ことがベストプラクティスとされています。

型を意識したコードを書くことは、自分自身のミスを減らすだけでなく、他のエンジニアがコードを読んだ際の理解を助けることにも繋がります。

もし既存のコードで != が多用されている場合は、リファクタリングの際に !== への変更を検討してみてください。

もちろん、外部ライブラリの仕様などで意図的に型変換を利用したい場合を除き、基本は !== を選ぶのが安全です。

まとめ

PHPにおけるノットイコール演算子の使い分けは、プログラムの堅牢性に直結する重要なテーマです。

!=(等価演算子)は型を自動的に変換して比較するため便利ですが、意図しない判定結果を招くリスクがあります。

一方、!==(厳格な不等演算子)は値と型の両方をチェックするため、予期せぬ挙動を防ぎ、安全なコードを実現できます。

現代のPHP開発においては、常に !== を使用することを標準とし、型変換が必要な場合のみ明示的にキャストを行う手法が最も推奨されます。

演算子の性質を正しく理解し、バグの少ないクリーンなコードを目指しましょう。