うんまぁいつものパターンだなぁと思いつつ。
えと…先に結論。「PHPは変数型を(プログラマが)強く強く強く意識しましょう」って感じ。
…結構はまるなぁ本気で orz
先にテストコード
$a = '69'; $b = '240'; print "$a : $b \n"; print dump_string($a) . ' : ' . dump_string($b) . "\n"; var_dump( $a & $b ); var_dump( $a & ($b+0) ); var_dump( ($a+0) & ($b+0) ); $s = ($a & $b); print dump_string($s) . "\n"; var_dump( $a | $b ); var_dump( $a | ($b+0) ); var_dump( ($a+0) | ($b+0) ); $s = ($a | $b); print dump_string($s) . "\n"; var_dump( $a ^ $b ); var_dump( $a ^ ($b+0) ); var_dump( ($a+0) ^ ($b+0) ); $s = ($a ^ $b); print dump_string($s) . "\n"; function dump_string(&$s, $flg = true) { //var_dump($s); $len = strlen($s); if (true === $flg) { $ret = $s . '('; } else { $ret = '('; } for($i = 0; $i < $len; $i ++) { $ret .= sprintf("(%02x)", ord($s[$i])); } $ret .= ')'; return $ret; }
あ。
dump_stringは、元々はdebug_utilってクラスに入ってるやつで、この子はMagicWeaponの一員です。
現在、絶賛公開中w(宣伝)。
おいといて。
実行は各自どんぞ。
dump_stringはヘキサで出力してるので、後は適宜、暗算なり電卓なりでビット演算するとわかると思う。
文字列が数値的に0になるとnul文字扱いになってそこで文字は終端になるっぽ。
…と思ったけど一応のせとくか。結果。
[gallu@local ~]$ php t.php
69 : 240
69( (36)(39) ) : 240( (32)(34)(30) )
string(2) "20"
int(64)
int(64)
20( (32)(30) )
string(3) "6=0"
int(245)
int(245)
6=0( (36)(3d)(30) )
"tring(2) "
int(181)
int(181)
( (04)(0d) )
で…んと…速やかに原典を引用。
http://www.php.net/manual/ja/language.operators.bitwise.php
データ型の変換に注意しましょう。両辺のパラメータが文字列の場合、 ビット演算子は文字の ASCII コードで演算を行います。
まぁ…わからんでもないのですがね。
昨今、そも「ビット演算ってなに?」ってお話しも多いご時世じゃぁござんすが。
ビット演算するときは、くれぐれも変数型にはご注意を。
………っつか。やっぱり「型を自動推測」って、言語的に「邪魔なだけなんぢゃなかろうか?」とか思ってしまう今日この頃です orz