Edited at

PHP クラスのプロパティ(メンバ変数)を連想配列に変換する

クラスのプロパティを連想配列に変換したいことがあったので備忘録です。

<?php

class Sample
{
protected $test2 = 'bbb';
public $test3 = 'ccc';
private $test1 = 'aaa';
const TEST4 = 'ddd';
public static $test4 = 'eee';
protected static $test5 = 'fff';
private static $test6 = 'ggg';

public function getAttributes(): array
{
$data = [];
foreach ($this as $key => $value) {
$data[$key] = $value;
}

return $data;
}

public function toArray(): array
{
return (array) $this;
}

public function getVariables(): array
{
return get_object_vars($this);
}
}

$sample = new Sample();

// ①
print_r($sample->getAttributes());
// ②
print_r($sample->toArray());
// ③
print_r(get_object_vars($sample));
// ④
print_r($sample->getVariables());


実行結果

$ php Sample.php

// ① の結果

Array
(
[test2] => bbb
[test3] => ccc
[test1] => aaa
)

// ② の結果

Array
(
[*test2] => bbb
[test3] => ccc
[Sampletest1] => aaa
)

// ③ の結果

Array
(
[test3] => ccc
)

// ④ の結果

Array
(
[test2] => bbb
[test3] => ccc
[test1] => aaa
)


② の補足

$this は配列にキャストできます。

ただし、その際にプロパティの分類に応じて、プロパティ名(配列キー)の前に特定のデータが付加されます。

publicプロパティ名は変更されません。

protectedプロパティには、「*」が先頭に付きます。

privateプロパティの先頭には、クラス名が先頭が付きます。


③, ④ の補足

get_object_vars(object $object): array は、指定した $object について、

そのスコープ内でアクセス可能な非staticプロパティを取得します。


参考