PHP
小ネタ
var_export

protected/privateメンバをReflectionを使わずに抜き取る(var_export編)

More than 1 year has passed since last update.

元記事

protectedメンバをReflectionを使わずに抜き取る

上記記事では継承を使ってprotectedメンバの値を取得していますが、var_exportでも同じことができます。

var_export専用のマジックメソッド__set_stateを逆利用する

ソースコード
/** 取り出したい対象のクラス(こっちは書き換えない) */
class Hoge
{
    protected $a = 'maa';
    private $b = 2;
}

/** 取り出すためのコード */
class TestHoge extends Hoge
{
    public static function __set_state($data)
    {
        // 本来オブジェクトを構築するための配列データをそのまま返す
        return $data;
    }
}
eval('$c='.var_export(new TestHoge, true).';');

// protectedメンバ$aを取得
echo $c['a'] . PHP_EOL;

// privateメンバ$bを取得
echo $c['b'] . PHP_EOL;
結果
maa
2

var_exportをオブジェクトに対して使うと__set_stateが呼び出され、その際protected/privateメンバの値が配列として取得できるので、これを利用しています。
裏技っぽい。

参考記事

get_object_varsでprivate/protectedなプロパティを取りたい