Do You PHP はてな このページをアンテナに追加 RSSフィード Twitter

2009-06-08

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

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さん、ありがとうございます:-)

kaitaukaitau 2009/06/10 20:43 キャストの説明、という意味では厳密にはこちらかと。
http://docs.php.net/manual/ja/language.types.array.php#language.types.array.casting
ちなみに、PHPUnitでassertAttributeContainsする時にこの仕様を利用しているっぽいですね。

shimookashimooka 2009/06/11 13:13 kaitauさん>
情報ありがとうございます。追記しておきました:-)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証