アーカイブ: 6月 2009, 17

2009/06/17

パーマリンク 23:56:56, 著者: Charlie

PHPではa==b, b==cでもc!=aなことがある

PHPの比較の素晴らしさ加減は正常 @ はてな匿名ダイアリー
  • PHPの「==」は数値比較なので、文字列は数値に変換されてから比較される。
  • PHPの「文字列→数値」の暗黙の変換は、文字列が0xで始まると、intval($str, 16)、つまり16進数として変換してくれる。
  • intval($str, 16)は、文字列の途中で変換できなくても文句を言わず、部分文字列を数値に変換する。なので、"0xax" == 10。
  • ただし、0で始まる文字列を8進数として変換してはくれない。

1と2は仕様と言われれば個人的には受け入れられる。
3あたりからチト厳しい。せめてlintで警告が欲しい。「===」と書いたつもりが「==」だった、というケアレスミス対策に。
4は対称性が崩れる分、覚える事が増えて面倒だ。暗黙の型変換がこういう仕様だというなら、それを明示的にやる関数 / 演算子があった方がよいと思う(既にあるのなら、教えてくださいPHPのえろい人)。

ちなみに、追加で確認してみたら

"hoge" == true かつ "hoge" == 0 かつ true != 0

だったので、「==」は数値比較演算子というよりも、自動的に型変換する演算子(かつ、CやJavaとは型変換の規則が異なる)として覚えた方が正確なのではないか。

追記

http://anond.hatelabo.jp/20090617164618のコード、

if (strcmp("0x0A", "10") == 0) {

でないと、チュッされちゃうのでは……。 strcmpは等しい時に0を返すので。

6月 2009
 << < 現在> >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

リンク

最近の記事

アーカイブ

検索

XMLフィード

blog engine