リフレクションAPI を使ってアトリビュートを読み取る
クラス、メソッド、関数、引数、プロパティ、クラス定数からアトリビュートにアクセスするために、 リフレクションAPI は対応するリフレクションオブジェクトに getAttributes() メソッドを提供しています。 このメソッドを使うと、 アトリビュートの名前や引数で問い合わせを行うことができ、 アトリビュートを表現するクラスをインスタンス化させることができます。 このメソッドは、ReflectionAttribute のインスタンスの配列を返します。
リフレクションされたアトリビュートの表現と、 実際のインスタンスを分離することで、 アトリビュートのクラスが存在しなかったり、 タイピングミスや引数の不足に関するエラーをプログラマが制御しやすくなります。 newInstance() を呼び出した後のみ、 アトリビュートクラスのオブジェクトはインスタンス化でき、 引数が合っているかを検証できます。これ以前のタイミングでは出来ません。
例1 リフレクションAPIを使い、アトリビュートを読み取る
<?php#[Attribute]class MyAttribute{ public $value; public function __construct($value) { $this->value = $value; }}#[MyAttribute(value: 1234)]class Thing{}function dumpAttributeData($reflection) { $attributes = $reflection->getAttributes(); foreach ($attributes as $attribute) { var_dump($attribute->getName()); var_dump($attribute->getArguments()); var_dump($attribute->newInstance()); }}dumpAttributeData(new ReflectionClass(Thing::class));/*string(11) "MyAttribute"array(1) { ["value"]=> int(1234)}object(MyAttribute)#3 (1) { ["value"]=> int(1234)}*/
アトリビュートクラスの名前を渡すことで、 リフレクションインスタンスの全てのアトリビュートをループさせる代わりに、 特定のアトリビュートのクラスだけを取得することができます。
例2 リフレクションAPIを使い、特定のアトリビュートを読み取る
<?phpfunction dumpMyAttributeData($reflection) { $attributes = $reflection->getAttributes(MyAttribute::class); foreach ($attributes as $attribute) { var_dump($attribute->getName()); var_dump($attribute->getArguments()); var_dump($attribute->newInstance()); }}dumpAttributeData(new ReflectionClass(Thing::class));