比較演算子にはイコール2つ(==)とイコール3つ(===)がありますが、基本的にイコール2つは使わないようにします。
緩やかな比較と厳密な比較
// 緩やかな比較
if( $a == $b ){
echo '$aと$bは同じです';
}
// 厳密な比較
if( $a === $b ){
echo '$aと$bは同じです';
}
イコール3つの厳密な比較は、型の一致まで比較します。
一方、イコール2つの緩やかな比較は、 型が違っていても同じと判断される場合があります。これは、暗黙的型変換によるものです。
暗黙的型変換
PHPには、状況に応じて変数の型を自動的に変換する仕組みがあります。この変換を暗黙的型変換といいます。
$a = 100;
$b = '100円';
if( $a == $b ){
echo '$aと$bは同じです';
}
この場合、文字列の$bが数値に型変換されます。文字列「100円」は数値に型変換されると数値「100」になるので、if文の条件を満たし「$aと$bは同じです」と出力されます。
$a = 0;
$b = 'PHP';
if( $a == $b ){
echo '$aと$bは同じです';
}
この場合も 「$aと$bは同じです」と出力されます。
文字列「PHP」は数字から始まっていないので、数値に型変換されると「0」になります。結果として、$aと$bが同じと判断されます。
このような挙動は予期せぬ不備を生みかねないので、比較演算子は基本的にイコール3つの厳密な比較を使うようにします。
「同じではない」ことを比較するときも、緩やかな比較と厳密な比較があります。こちらも基本的に厳密な比較を使うようにします。
// 緩やかな比較
if( $a != $b ){
echo '$aと$bは同じはありません';
}
// 厳密な比較
if( $a !== $b ){
echo '$aと$bは同じはありません';
}
in_array()でも厳密な比較を行う
配列に任意の値があるかをチェックする関数in_array()にも、緩やかな比較と厳密な比較を選べるオプションがあります。
関数in_array()は第1引数に「探す値」、第2引数に「探す先の配列」を入れます。そして第3引数はオプションになっていて、未入力だと緩やかな比較になり、trueを入れると厳密な比較になります。
$a = 0;
$b = ['JavaScript', 'PHP', 'Python'];
// 緩やかな比較
if( in_array($a, $b) ){
echo '$aは$bの中にあります';
}
// 厳密な比較
if( in_array($a, $b, true) ){
echo '$aは$bの中にあります';
}
この場合、緩やかな比較だと「$aは$bの中にあります」と出力されてしまいます。
まず、$aと文字列「JavaScript」が同じかどうかを比較しますが、このとき暗黙的型変換が行われて、文字列「JavaScript」は数値の「0」に変換されます。$aと数値「0」が同じなので、$aが$bの配列の中にあると判断されてしまいます。
このような挙動を避けるため、基本的にin_array()の第3引数にはtrueを書くようにします。
switch文は緩やかな比較しかできない
PHPのswitch文では、緩やかな比較が使われます。緩やかな比較でも問題がないか意識して使う必要があります。
$a = 0;
switch( $a ){
case 'PHP':
echo '$aはPHPです';
break;
case 0:
echo '$aは0です';
break;
}
この場合、「$aはPHPです」と出力されます。
より厳密に比較したい場合は、if文を使って「if( $a === ‘PHP’ )」とします。状況に応じて使い分ける必要があります。