ビット演算子の恐怖
PHPは暗黙の型変換をしてくれます。
余計なお世話なことが多いですが、適当プログラマには便利な場面もあります。
さて、ビット演算。フラグを複数設定したい場合なんかにたまに使いますが、こいつがまた余計なことをしてくれます。
なんと、文字列がビット演算できる!
データ型の変換に注意しましょう。両辺のパラメータが文字列の場合、 ビット演算子は文字の ASCII コードで演算を行います。
どうしてこうなるんだよ!!!!!!
じゃあ、文字列同士じゃない場合は?
試してみた。
<?php $a = '100'; $b = '20'; $c = 20; $d = 'foo'; var_dump($a | $b); // 数値へ変換可能な文字列同士 var_dump($a | $c); // Intと数値へ変換可能な文字列 var_dump($a | $d); // 数値へ変換可能な文字列と変換できない文字列 var_dump($c | $d); // Intと数値へ変換できない文字列 /* Output: string(3) "300" int(116) string(3) "w" int(20) */
- 文字列同士だと、asciiコードによる演算を行う
- 文字列同士じゃない場合は、Intへ暗黙の型変換されてるっぽい
もっとも考え得るはまりポイントとしては・・・「数値文字列同士をビット演算して、意図とは全く異なる結果が返ってくる。」ですかね。
いつも型を意識していない場合や、DBやテキストから数字を取得した時なんかは特に要注意。
おまけ
本当に内部でIntに型変換 しているらしい。あほか。
<?php var_dump(true | 20); // true と Int var_dump(false | 20); // false と Int var_dump(2.5 | 3.3); // float同士 /* Output: int(21) int(20) int(3) */
というわけで
PHPは本当に余計なおせっかい焼きのkuso
素晴らしい言語ですね!!!!