リフレクションAPI を使ってアトリビュートを読み取る

クラス、メソッド、関数、引数、プロパティ、クラス定数からアトリビュートにアクセスするために、 リフレクションAPI は対応するリフレクションオブジェクトに getAttributes() メソッドを提供しています。 このメソッドを使うと、 アトリビュートの名前や引数で問い合わせを行うことができ、 アトリビュートを表現するクラスをインスタンス化させることができます。 このメソッドは、ReflectionAttribute のインスタンスの配列を返します。

リフレクションされたアトリビュートの表現と、 実際のインスタンスを分離することで、 アトリビュートのクラスが存在しなかったり、 タイピングミスや引数の不足に関するエラーをプログラマが制御しやすくなります。 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を使い、特定のアトリビュートを読み取る

<?php

function dumpMyAttributeData($reflection) {
    
$attributes $reflection->getAttributes(MyAttribute::class);

    foreach (
$attributes as $attribute) {
       
var_dump($attribute->getName());
       
var_dump($attribute->getArguments());
       
var_dump($attribute->newInstance());
    }
}

dumpMyAttributeData(new ReflectionClass(Thing::class));
関連キーワード:  アトリビュート, クラス, メソッド, インスタンス, オブジェクト, 特定, 表現, 名前, ReflectionAttribute, 対応