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

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

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

http://blog.mura.com/blogs/htsrv/trackback.php/1115

コメント, トラックバック, ピンバック:

この投稿への コメント/トラックバック/ピンバック はまだありません...

コメントを残す:

頂いたメールアドレスはこのサイト上には表示されません
頂いたURLは表示されます。

使用可能な XHTML タグ: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(改行が自動で <br /> になります)
(名前、メールアドレス、URLを記憶する Cookie を発行します)
(ユーザがメッセージ・フォームを通してあなたに連絡することを許可します (あなたのメール・アドレスは表示されません))

Charlie's volatile short

3月 2010
 << <   > >>
  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      

リンク

  • ありくい - ブログが手軽に書けます。ボタン一つでコンテンツマッチ・アフィリエイトが挿入できるブログツール「どこでもありくい」も提供中。
  • glucose2 - ブログをたくさん読むならRSSリーダー
  • エンジニア募集中 [Perl, PHP, JavaScript][SOHO, アルバイト可]

  • ブログ之ネタ [ブロガー御用達ポータル]

  • rico [PV改善,サイト内SEO,ブログパーツ]

アーカイブ

検索

いろいろ

XMLフィード

RSSとは?

オンラインユーザ一覧

  • ゲスト ユーザ: 2

powered by
b2evolution