世界のクソコードから学ぶ、int型と比較したときのString型の挙動

スポンサーリンク

クソコード

どうも、サーロインです。

みなさんはshitcode(クソコード)というサイトをご存知でしょうか?

shitcode.net
shitcodeはクソコードを世界のプログラマー同士でシェアすることのできるサイトです。

見てるだけで反面教師になり、とても勉強になるサイトです!
今回はshitcodeからある一つのクソコードを紹介します。

ソースコード

$i = 0;
 
if ($i == 'dupa') {
   echo 'dupa';
} else {
   echo 'nie dupa';
}

(引用元:https://shitcode.net/49#disqus_thread

こちらが今回のクソコード。
これを実行した時の出力は何になるでしょうか?

一見すると'nie dupa'が出力されるように見えますが、実際は'dupa'が出力されます。
実は、$i=='dupa'がtrueを返しているのです。

int型とString型を比較する

引用元のコメント欄には以下のような記述がありました。

'a string' == 0 also evaluates to true because any string is converted into an integer when compared with an integer. If PHP can't properly convert the string >then it is evaluated as 0. So 0 is equal to 0, which equates as true.

$i=='dupa'のようにStringがintと比較された時、Stringはintegerに変換されます。そのときにPHPが正確に変換できなかった場合、そのStringは0に置き換えられる仕様になっています。
そのためif ($i=='dupa')はいわば「0=0」なのでtrueを返し、'dupa'が出力されます。

PHPは型宣言を省略できるので、こういった知識はしっかりと覚えておかないと痛い目見そうだなあ。

にほんブログ村 IT技術ブログへ
にほんブログ村