'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と等価)