ビット演算子の恐怖

PHPは暗黙の型変換をしてくれます。
余計なお世話なことが多いですが、適当プログラマには便利な場面もあります。

さて、ビット演算。フラグを複数設定したい場合なんかにたまに使いますが、こいつがまた余計なことをしてくれます。
なんと、文字列がビット演算できる!

データ型の変換に注意しましょう。両辺のパラメータが文字列の場合、 ビット演算子は文字の ASCII コードで演算を行います。

PHP: ビット演算子 - Manual

どうしてこうなるんだよ!!!!!!

じゃあ、文字列同士じゃない場合は?

試してみた。

<?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
素晴らしい言語ですね!!!!