がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

そ〜きたか orz

うんまぁいつものパターンだなぁと思いつつ。
えと…先に結論。「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