PHP の比較演算子 '==' の妙

比較演算子の気をつけたい仕様

PHP の比較演算子 == の結果が直感的でないものや他言語と違う結果になる。

null の正体

ゼロと null 比較の曖昧さ。$x = 0; としたときに、以下のような比較結果が返ってくる。

true となる比較

$x == 0
$x === 0
$x == null // コレが通ってしまう

false となる比較

$x === null

比較コード null.php

適当に値を比較してみた。

<?php
echo null;

$x = array();
if ($x == 0) {
    echo "x == 0\n";
}
if ($x === 0) {
    echo "x === 0\n";
}
if ($x == null) {
    echo "x == null\n";
}
if ($x === null) {
    echo "x === null\n";
}

$y = 0;
if ($y == 0) {
    echo "y == 0\n";
}
if ($y === 0) {
    echo "y === 0\n";
}
if ($y == null) {
    echo "y == null\n";
}
if ($y === null) {
    echo "y === null\n";
}

$z = array(0);
if ($z == 0) {
    echo "z == 0\n";
}
if ($z === 0) {
    echo "z === 0\n";
}
if ($z == null) {
    echo "z == null\n";
}
if ($z === null) {
    echo "z === null\n";
}
?>

実行結果

$ php null.php
x == null
y == 0
y === 0
y == null

文字列比較

整数値にキャストされてしまう場合があるので注意が必要です。

整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。これらの ルールは、 switch 文にも適用されます。

比較演算子 - PHP マニュアル

比較コード string.php

<?php
if (0 == 'str') {
    echo "'str' == 0\n";
}
if (true == 'str') {
    echo "'str' == true\n";
}
if ('str' == 'str') {
    echo "'str' == 'str'\n";
}
?>

実行結果

$ php string.php
'str' == 0
'str' == true
'str' == 'str'

文字列比較は、以下のような形で比較したほうが良いです。

$a === $b
strcmp($a,$b) == 0

比較演算 ===

値の型までチェックして比較してくれます。配列の場合、各要素も比較されます。

変数の型をチェック

<?php
$x = array(
  'p' => '123',
  'q' => 'w',
);
$y = array(
  'p' => 123,
  'q' => 'w',
);
var_dump($x == $y);
var_dump($x === $y);
?>

実行結果

bool(true)
bool(false)

変数の順序をチェック

<?php
$x = array(
  'p' => 'a',
  'q' => 'b',
  'r' => 'c',
);
$y = array(
  'q' => 'b',
  'p' => 'a',
  'r' => 'c',
);
var_dump($x == $y);
var_dump($x === $y);
?>

実行結果

bool(true)
bool(false)