最近必要に迫られてPHPを触りはじめました。ゆくゆくはWordPressプラグインとか作れるようになりたいですね。
本題。
1
if ("1" == 1) { echo "ほげ" . PHP_EOL; } else { echo "ふが" . PHP_EOL; }
実行すると、「ほげ」と出力されます。
まあ、この程度であればよくある話ですよね。文字列と数値を比較したとき、勝手に文字列が数値に変換されるというのはよくある話です。JavaScriptとかもこういった仕様ですしね。
というか、そもそも文字列と数値を比較しないといけなくなるようなコードを書いてる時点で設計が間違ってますし。この部分が問題になることは少ないでしょう。
しかし、本当に怖いのはこれから。
2
if ("1" == "01") { echo "ほげ" . PHP_EOL; } else { echo "ふが" . PHP_EOL; }
これも実行すると「ほげ」と出力されます。
……
いや、お節介にも程があるだろ、この機能。
文字列と文字列の比較してるのに、何故か勝手に両辺を数値に変換してくれています。何というありがた迷惑……。
3
if ("10" == "010") { echo "ほげ" . PHP_EOL; } else { echo "ふが" . PHP_EOL; }
これも実行すると「ほげ」と出力されます。
一見、さっきのコードと変わらないように見えます。
しかし、同じことを文字列ではなく数値でやってみましょう。
if (10 == 010) { echo "ほげ" . PHP_EOL; } else { echo "ふが" . PHP_EOL; }
こちらは実行すると「ふが」と出力されます。
うんうん。頭に0つけると8進数に変換されるから、010 == 8 != 10なのは当たり前ですよね。これも他の言語でもよくある仕様です。
文字列の場合は基数変換されずに10進数でそのまま解釈されるようです。まあ、このあたりはギリギリ許容範囲かな?
4
if ("0x10" == "16") { echo "ほげ" . PHP_EOL; } else { echo "ふが" . PHP_EOL; }
実行結果: 「ほげ」
いやお前、さっきは基数変換しなかっただろ……?
何で16進数になった途端、待ってましたとばかりに基数変換してくるんだ……8進数でもやれよ……
結論
==演算子は使うな。