tetsunosukeのnotebook

tetsunosukeのメモです

文字列と数値の比較について、それはクソだろう。

'abc' == 0 になることなんてPHPをちゃんとやっていれば有名な事実なのですが

これも気をつけたほうがいいと思います。

$ php -r "echo '011'  == 9 ? 'equal':'not equal';"
not equal

$ php -r "echo '011'  == 11 ? 'equal':'not equal';"
equal

php -r "echo '0x11'  == 17 ? 'equal':'not equal';"
equal

Manualにあるとおり、

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

なわけなのですが、有効なデータには当然下記のような8,16進数の値を含むはずです。

  • $a = 0123; // 8進数 (10進数の83と等価)
  • $a = 0x1A; // 16進数 (10進数の26と等価)

ですが上記のように、8進数の場合はちゃんと解釈してくれません。(PHP 5.2.0 (cli))