Hatena Blog Tags

2a問題

(コンピュータ)
にえーもんだい

PHP言語固有と思われる問題(でもない。同じ書式ならPerlでも発生する。ただ、Perlの場合「文字列の比較にはeqを用いる」文化がわりとしっかりと根付いているので、結果として問題が顕在化しにくい)。
端的に書くと

if ('2a' == 2) {
 ここ通る
}

このような事象が起きる。
理由は
http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion

文字列の変換
数値として文字列が評価された時、結果の値と型は次のように定義されます。
文字列は、'.'、'e'、'E' のどれかが含まれている場合は float、それ以外は整数として評価されます。
文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は 'e' または 'E' の後に 1 つ以上の数字が続く形式です。

ほかにも色々と「予想外にtrueになるケース」があるため、PHPerな諸氏には十分な注意を呼びかけたいものである。
とりあえず単純な解法としては

  • 文字列の比較にはstrcmpなどを使う
  • ===演算子を使う

など。

このタグの解説についてこの解説文は、すでに終了したサービス「はてなキーワード」内で有志のユーザーが作成・編集した内容に基づいています。その正確性や網羅性をはてなが保証するものではありません。問題のある記述を発見した場合には、お問い合わせフォームよりご連絡ください。

関連ブログ