オブジェクトを配列にキャストしたときのキー
PHPマニュアルのどこかに書いてあるのかも知れませんが。。。
たとえば
<?php class ClassA { private $a; protected $b; public $c; } $obj = new ClassA(); var_dump(array_keys((array)$obj));
を実行すると、
$ php test.php array(3) { [0]=> string(9) "ClassAa" [1]=> string(4) "*b" [2]=> string(1) "c" } $
という具合に、メンバー変数名をキーとする配列に変換されるわけです(オブジェクトをarrayにキャストする - Do You PHP はてなも参照)が、よーくみると、
- privateメンバーのキー"ClassAa"のバイト長が"9"
- protectedメンバーのキー"*b"のバイト長が"4"
と2バイト分多くなっています。
何がどう埋まってるのかと思い、urlencodeしたものを出力してみると
$ php test.php <?php class ClassA { private $a; protected $b; public $c; } $obj = new ClassA(); foreach (array_keys((array)$obj) as $value) { var_dump(urlencode($value)); } $ php test.php string(13) "%00ClassA%00a" string(10) "%00%2A%00b" string(1) "c" $
あー。。。なるほど。クラス名や"*"がNULL文字に囲まれてるのか。