数値として比較
これは当然の結果
$a = 1;
$b = 01;
if ($a == $b) {
echo "true";
} else {
echo "false";
}
// true
if ($a === $b) {
echo "true";
} else {
echo "false";
}
// true
文字列として比較
こちらは結果が違う
== だと true、 === だと false
簡単な違いだけど間違えそうだ
$a = "1";
$b = "01";
if ($a == $b) {
echo "true";
} else {
echo "false";
}
// true
if ($a === $b) {
echo "true";
} else {
echo "false";
}
// false
数値と文字列の比較
$a = "1";
$b = 1;
if ($a == $b) {
echo "true";
} else {
echo "false";
}
// 文字列は数値に変換されて比較されるので true
if ($a === $b) {
echo "true";
} else {
echo "false";
}
// 型が違うので false
if ($a === (string)$b) {
echo "true";
} else {
echo "false";
}
// 明示的に文字列として比較すれば true
// (逆に (int)$a === $b でも true)
8進数と16進数での比較
/*
16進数
*/
$a = "0x0A";
$b = 10;
if ($a == $b) {
echo "true";
} else {
echo "false";
}
// true
// 自動的に16進数として変換されている
/*
8進数
*/
$a = "010";
$b = 8;
if ($a == $b) {
echo "true";
} else {
echo "false";
}
// false
// 8進数は自動的にならない?
if (intval($a, 8) == $b) {
echo "true";
} else {
echo "false";
}
// true
// 明示的に8進数としてやらないとダメ?
参考
■ PHP: 比較演算子 - Manual
■ PHP: intval - Manual