はじめに
PHP8 上級試験では、Reflection API を使ったクラスの解析問題がよく出題されます。
特に ReflectionClass::getConstants()
は、アクセス修飾子(public / protected / private)に関係なく、クラスで定義されている全ての定数を取得できる点がポイントです。
「protected や private も取得できるの?」と迷いやすいですが、Reflection はあくまでメタ情報を扱うため、通常のアクセス制限を無視して取得可能です。
目次
コード例
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge {
public const PUB_NUM = 111;
protected const PRO_NUM = 333;
private const PRI_NUM = 555;
}
$robj = new ReflectionClass(Hoge::class);
foreach ($robj->getConstants() as $k => $v) {
echo "{$k}: {$v}\n";
}
実行結果
PUB_NUM: 111
PRO_NUM: 333
PRI_NUM: 555
フィルタを使った取得(PHP7.1以降)
$publicConstants = $robj->getConstants(ReflectionClassConstant::IS_PUBLIC);
print_r($publicConstants);
Array
(
[PUB_NUM] => 111
)
ASCII 図解
┌───────────────┐
│ class Hoge │
│───────────────│
│ PUB_NUM │
│ PRO_NUM │
│ PRI_NUM │
└───────────────┘
│
▼ ReflectionClass::getConstants()
┌─────────────────────────┐
│ Array( │
│ PUB_NUM => 111, │
│ PRO_NUM => 333, │
│ PRI_NUM => 555 │
│ ) │
└─────────────────────────┘
試験ポイントまとめ
- getConstants() はアクセス修飾子に関係なく全定数を取得できる
- PHP7.1+ ではフィルタでアクセス修飾子を指定可能
- Reflection はあくまで「メタ情報」を取得する機能である
- 出力結果が
PUB_NUM / PRO_NUM / PRI_NUM
であれば 正解