2013-01-23

ジョジョに奇妙なPHPの型変換

PHP使っている人ならわかると思うけど、

PHPはif文での比較時に怪しげな型変換が起こる。

ポイントは以下の通り

文字列型と数値型の比較場合

 数値型と同じ型にキャストされる

文字列型と文字列型の比較でも、両方とも数値形式の場合

 数値型へキャストされる

http://techblog.ecstudio.jp/tech-tips/php-string-compare.html

それを踏まえた上でこっちが本題なのだ

PHP関数の中での比較が気になった。

in_arrayは第三引数で「===」を使用するかどうか指定できるが

array_key_existsではそのような指定はない。

ちょっとどうなっているのか気になったので

挙動を確認してみた。

下記にソースがあるが、動かして見たところ

単純な「==」を使っているわけでも

「===」を使っているわけでもないらしいということがわかった。

in_arrayとは違ってもう少し厳密な処理をやっているみたい。

極めて人間的で常識的な挙動をするけど、

PHP的にはちょっと異端な動きをするということみたいwww

PHPさんパネェっすwwww

------------------------------------------------------------

if (1 === '1') {

echo "true";

} else {

//こっちに分岐

//厳密な型比較では違う

echo "false";

}

if ('a' == 0) {

//こっちに分岐

// 'a'が数値型にキャストされて0になる

echo "true";

} else {

echo "false";

}

if ('5e0' == '5') {

//こっちに分岐

//両方とも文字列型だが、両方とも数値形式の場合PHPは何故か数値型へキャストする

echo "true";

} else {

echo "false";

}

$ArrTest = array(

1 => ''

, 'a' => ''

, '5e0' => ''

);

if (array_key_exists('1', $ArrTest) == true) {

//こっちに分岐

//array_key_exists内では単純に「===」を使っているわけではないらしい

echo "true";

} else {

echo "false";

}

if (array_key_exists(0, $ArrTest) == true) {

echo "true";

} else {

//こっちに分岐

//array_key_exists内では単純に「==」を使っているわけではないらしい

echo "false";

}

if (array_key_exists('5', $ArrTest) == true) {

echo "true";

} else {

//こっちに分岐

//array_key_exists内では単純に「==」を使っているわけではないらしい

echo "false";

}

exit;

  • array の keyexistは 数値ではなく 文字にキャストされているのでは? 0を文字にキャストすると"0"だろ

    • コメントありがとうございます。元増田です。 一瞬そうかと思ったのですが、 stringにキャストしてから比較してるわけではないようです。 http://anond.hatelabo.jp/20130123190650 -------------------...

      • ✕ //そのまま比較しているわけでもstringに比較しているわけでもないらしい ○ //そのまま比較しているわけでもstringにキャストしているわけでもないらしい

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん