Reflection API로 Attributes 읽기

클래스, 메서드, 함수, 매개변수, 속성 및 클래스 상수의 attributes에 액세스하기 위해 Reflection API는 해당하는 반사 객체 각각에 getAttributes() 메서드를 제공합니다. 이 메서드는 attribute 이름, 인수에 대해 쿼리하고 표시된 attribute의 인스턴스를 인스턴스화할 수 있는 ReflectionAttribute 인스턴스의 배열을 반환합니다.

반사된 attribute 표현을 실제 인스턴스와 분리하면 attribute 클래스 누락, 유형이 잘못되었거나 인수 누락과 관련된 오류를 처리하기 위해 프로그래머의 제어가 향상됩니다. ReflectionAttribute::newInstance()를 호출한 후에야 attribute 클래스의 개체가 인스턴스화되고 인수의 올바른 일치가 이전이 아니라 유효성이 검사됩니다.

예제 #1 Reflection API를 사용하여 Attributes 읽기

                  
<?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)
}
*/
                  
                

리플렉션 인스턴스에서 모든 attributes을 반복하는 대신 검색된 attribute 클래스 이름을 인수로 전달하여 특정 attribute 클래스의 attribute만 검색할 수 있습니다.

예제 #2 Reflection API를 사용하여 특정 Attributes 읽기

                  
<?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));