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を返すので。

この記事へのトラックバック アドレス

Trackback URL (right click and copy shortcut/link location)

フィードバックはまだありません...

コメントを残す


Your email address will not be revealed on this site.
(改行が自動で <br /> になります)
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)
5月 2024
 << <   > >>
      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 31  

リンク

最近の記事

アーカイブ

検索

XMLフィード

powered by b2evolution free blog software