FC2ブログ
2009
06.19

なんだこれw

ぬるぽん先生に教えてもらったんだが

PHPの比較の素晴らしさ加減は正常

if(10 == "10"){
print "????\n";
}


これも true になる・・・
まぁこれも許そう。

if(0x0A == "10"){
print "????\n";
}


これもtrue。許せる、まぁ。

if("0x0A" == "10"){
print "????\n";
}


これが true になる理由がわからねえええええ
なんで勝手にキャストすんの???
"0x0A" って とりあえず文字列じゃねえの??

マニュアルから

$a == $b 等しい $a が $b に等しい時に TRUE。



いや、まぁそういう仕様ならいいですけどね、

いいですけどね。。


数値を入れるフォームに、
16進数で色々突っ込んでみたくなってまいりました。




でもさ、

$param = "0x0A";
print intval($param) . "\n";

$param = 0x0A;
print intval($param) . "\n";



ってやると、

0
10



ってちゃんと返ってくるんだよね。

統一性のなさを感じます。

一応、この辺を読むと、

strtod(3) を使って変換しているっぽいので、

man strtod

入力する文字列 (の先頭部分) は以下の形式が期待されている。先頭にホワイトスペース、次にプラス (’+’) またはマ イナス (’-’) の記号、その後に (i) 10 進数、(ii) 16 進数、(iii) 無限、 (iv) NAN (計算できない数、not-a-number) の いずれかがある (ホワイトスペース、符号は省略可能。ホワイトスペースは isspace(3) で識別される)。


16 進数は、"0x" または "0X" とその後に続く 1 文字以上の 16 進の数字の列からなり、



ということなので、0x で始まる "0x0A" が 10 に変換されるのは、おかしくないと言える。


まぁなんだ

そういう仕様だから仕方ない


ということですね。


でも、ただ言えるのは

やっぱきめえ


っと、いちいちifで書かなくても

var_dump("0x0A" == "10");


って書けるのね。




スポンサーサイト



トラックバックURL
http://noriko3.blog42.fc2.com/tb.php/219-9dcf38c0
トラックバック
コメント
管理者にだけ表示を許可する
 
back-to-top