PHPの比較
PHPには、2つの変数が等しいことを比較する演算子が==
と===
で2つある。
==
は、暗黙的に型を相互変換した後に行われる比較。
===
は、型も含めた比較となる。
PHP: 比較演算子 - Manual
2a問題
暗黙的な型変換による比較というのは、多言語経験者から見ると違和感の大きいものらしく、
「2a問題」という名前で取り上げられることもある。
"2a"
という文字列が、==
で整数型の2
と比較した際に等しくなってしまうというやつだ。
<?php $a = 2; $b = "2a"; if ($a == $b) { echo "$a == $b is True"; } if ($a === $b) { echo "$a === $b is True"; } //$a == $b is Trueのみ出力される
==
についての不思議な挙動は、下記でもっと深く見ることができる。
素晴らしき自動的な世界〜或いは「型のない」世界〜 - がるの健忘録
PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記
その他の関数
じゃあ基本的に==
は使わず、===
を使おうという話なんだけど、
実はin_array
とかsort
とか、switch
とかarray_search
とか…
PHP自体の組み込み関数には、デフォルトで==
と同様の比較をしているものがある。
例に挙げた以外にも多分あるんだと思うんだけど、まとまって参照できるところがなくてわからない。
(誰か知ってたら教えてくれ)
in_array
とかarray_search
こいつらには第三引数にstrict
ってのがあって、
これをtrue
にすると型までみていい感じにしてくれる。
デフォルトだと緩い比較なのでガバガバ。
PHPのin_arrayは罠が多いので注意喚起が必要 - Qiita
PHP: in_array - Manual
sort
あとこいつも第二引数で比較方法を設定できていい感じ。
デフォルトだと(略)
設定値 | 説明 |
---|---|
SORT_REGULAR | 通常通りに項目を比較 (型は変更しません) |
SORT_NUMERIC | 数値的に項目を比較 |
SORT_STRING | 文字列として項目を比較 |
SORT_LOCALE_STRING | 現在のロケールに基づいて比較します。 比較に使うロケールは、setlocale() で変更できます。 |
SORT_NATURAL | 要素の比較を文字列として行い、 natsort() と同様の「自然順」で比較します。 |
SORT_FLAG_CASE | SORT_STRING や SORT_NATURAL と (ビット OR で) 組み合わせて使い、 文字列のソートで大文字小文字を区別しないようにします。 |
PHPのsort関数は相当おかしい - hnwの日記
PHP: sort - Manual
switch
構文的に厳密な比較に対応してない。
ハマりやすい。
<?php $i = "0"; switch ($i) { case 0: echo "iは0に等しい"; break; case 1: echo "iは1に等しい"; break; case 2: echo "iは2に等しい"; break; default: echo "iは0,1,2に等しくない"; } // "iは0に等しい"が出力されちゃう
回避するにはこうする。
<?php $i = "0"; switch (true) { case $i === 0: echo "iは0に等しい"; break; case $i === 1: echo "iは1に等しい"; break; case $i === 2: echo "iは2に等しい"; break; default: echo "iは0,1,2に等しくない"; } // "iは0,1,2に等しくない"が出力される
こうなるとif-else
でいいんじゃ?って気もしてくるけど、
switch
使いたいときもあるから気をつけないといけない。