PHP Conference Fukuoka 2025

リフレクション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));
add a note

User Contributed Notes 1 note

up
6
Hirusha Sharma
4 years ago
Fetch properties from functions:----------------------------------------Function definition with attributes:----------------------------------------#[ReadOnly]#[Property(type: 'function', name: 'Hello')]function Hello(){    return "Hello";}-----------------------------------------Gather attributes from the function-----------------------------------------function getAttributes(Reflector $reflection){    $attributes = $reflection->getAttributes();    $result = [];    foreach ($attributes as $attribute)    {        $result[$attribute->getName()] = $attribute->getArguments();    }    return $result;}$reflection = new ReflectionFunction("Hello");print_r(getAttributes($reflection));-----------------------------OUTPUT-----------------------------Array(    [ReadOnly] => Array        (        )    [Property] => Array        (            [type] => function            [name] => Hello        ))
To Top