Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

オブジェクトを配列にキャストしたときのキー

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文字に囲まれてるのか。

追記(2009/06/08 12:41)

やっぱりPHPマニュアルに書いてあった。。。

追記2(2009/06/11 12:53)

こちらの説明の方が良いです。kaitauさん、ありがとうございます:-)