Edited at

PHPで親クラスから子クラスのprivateなプロパティにアクセスしたかった


はじめに


やりたかったこと

クラスのプロパティとその値をまとめて連想配列で返す関数を、共通の親クラスに実装したかった。

つまり、EntityとかVOみたいなクラスが沢山あって、APIなりにjson形式とかで渡すとき、

各クラスにto_array()メソッドなりを実装するのってかったるいなあって思った。


問題点

……が、privateなプロパティはそれぞれのインスタンス内からしか触れないために、親クラスのメソッドからは参照できなかった。

ので、共通化するいい方法があんまりなさそうだった。


結論

ReflectionClassを使うしかなさそう…?


つまり

class Parent

{
public $publicPropertyParent = 'aaa';

private $privatePropertyParent = 'bbb';

/**
* 親クラスに共通で配列化メソッドを定義したい
*/

public function toArray()
{
return get_object_vars($this);
}
}

class Child extends Parent
{
public $publicPropertyChild = 'ccc';

private $privatePropertyChild = 'ddd';
}

$child = new Child();
var_dump($child->toArray());
// ['publicPropertyParent' => 'aaa',
// 'privatePropertyParent' => 'bbb',
// 'publicPropertyChild' => 'ccc']

// $privatePropertyChildが取れない


どうしたか

public function toArray() {

$array = [];
$ref = new \ReflectionClass($this);
foreach ($ref->getProperties as $property) {
$property->setAccessible(true);
$array[$property->getName()] = $property->getValue($this);
}
return $array;
}

哀しみがある。。

privateで持たなければ良いとかまあそれはおっしゃる通りではあるんですが。

こんなやり方あるよっていうのがあれば教えてください……!


参考