揮発性のメモ2

http://d.hatena.ne.jp/iww/

PHPで、プロパティを全部見る

<?
class Hoge {
    static $foo = 1;
    static $bar = 2;
    static $baz = 3;
	
    public $hoge = 4;
    public $fuga = 5;
    public $piyo = 6;

    private $aaa = 7;
    private $bbb = 8;
    private $ccc = 9;

    protected $ddd = 10;
    protected $eee = 11;
    protected $fff = 12;
}

このクラスの変数をぜんぶ見たい! ぜんぶ!

静的プロパティを見る

静的プロパティの一覧を取得する関数があるので、それを使うだけ

<?
$ref = new ReflectionClass('Hoge');
$list = $ref->getStaticProperties();
foreach($list as $k => $v) echo "$k => $v\n";
/*
foo = 1
bar = 2
baz = 3

publicなプロパティを見る

動的プロパティの一覧を取得する関数があるので、それを使うだけ

<?
$o = new Hoge();
$list = get_object_vars($o);
foreach($list as $k => $v) echo "$k = $v\n";
/*
hoge = 4
fuga = 5
piyo = 6

privateなプロパティを見る

ReflectionClass を使うと、クラス情報を取得できる。
で、getProperties() を使うと プロパティ情報(ReflectionProperty)のリストを取得できる。

<?
$o = new Hoge();
$ref = new ReflectionClass($o);
$props = $ref->getProperties(ReflectionProperty::IS_PRIVATE);
$list = [];
foreach($props as $p){
    $p->setAccessible(true); // PHP8.1からは不要
    $list[$p->getName()] = $p->getValue($o);
}
foreach($list as $k => $v) echo "$k = $v\n";
/*
aaa = 7
bbb = 8
ccc = 9

protectedなプロパティを見る

やり方はprivateとまったく同じ

<?
$o = new Hoge();
$ref = new ReflectionClass($o);
$props = $ref->getProperties(ReflectionProperty::IS_PROTECTED);
$list = [];
foreach($props as $p){
    $p->setAccessible(true); // PHP8.1からは不要
    $list[$p->getName()] = $p->getValue($o);
}
foreach($list as $k => $v) echo "$k = $v\n";
/*
ddd = 10
eee = 11
fff = 12

PHPではprivate変数でもなんでも覗き放題なので、privateなんか全然意味ねーな