Yuki猫のおうち

気ままに自由に日々を生きる

[php]phpの文字列比較時に自動型変換されているのを知らなくてハマった話

違う文字列なのに一致する...?

phpは型の制約が緩い分、意図しないところで勝手に型変換されていたりして困っちゃうことが時々あります。

例えば、文字列の比較を==で行うと、以下のような驚きの結果に。

$ echo "5seq" == 5; // true
$ echo "3.0" == "3"; // true

これは、==で整数値と文字列を比較する際、文字列を内部処理でint型にキャストしてしまっていることが原因です。

どうすればいいのか?

文字列の比較の際には===を使うことで、明示的にstringでの比較を行うことができます。

$ echo "5seq" === 5; // false
$ echo "3.0" === 3; // false


また、数字での比較を明確に行いたいならば、is_numeric()メソッドで文字列が数字であることを保証するという方法が取れます。
formから受け取ったユーザ入力を扱う場合などは、面倒ですが比較の前にこの処理をはさんでおくと確実です。

$str = "5sec";
if(is_numeric($str)) { // ここでfalseになる
  if($str == 数字) {
    ...
  }
}

あるいは、扱う文字列が明確に数字である場合などは、あらかじめ明示的にキャストしてしまうという手もあります。

  $str = (int)"3min";
  if($str == 3) { // true
    ...
  }


型が緩いと便利ではありますが、コードを書く際はしっかりと意識しないといけませんね。