PHP 8 리플렉션 API로 속성 읽기
PHP 8에서는 속성(Attribute)을 클래스, 프로퍼티, 클래스 상수, 메서드, 함수, 매개변수 등 다양한 대상에 선언하고 접근할 수 있습니다.
PHP 8의 리플렉션 API(Reflection API)는 이러한 속성을 읽을 수 있도록 모든 관련 리플렉션 객체에 getAttributes() 메서드를 제공합니다.
getAttributes() 메서드는 ReflectionAttribute 인스턴스들의 배열을 반환합니다. 각 인스턴스를 통해 속성의 이름(getName()), 전달된 인자(getArguments())를 확인할 수 있으며, 필요하다면 newInstance() 메서드로 해당 속성의 실제 인스턴스를 생성할 수도 있습니다.
예제: 리플렉션 API로 속성 읽기
<?php
#[Reading]
#[Property(type: 'function', name: 'Student')]
function Student()
{
return "Student";
}
function getAttributes(Reflector $reflection)
{
$attributes = $reflection->getAttributes();
$finalresult = [];
foreach ($attributes as $attribute)
{
$finalresult[$attribute->getName()] = $attribute->getArguments();
}
return $finalresult;
}
$reflection = new ReflectionFunction("Student");
print_r(getAttributes($reflection));
?>실행 결과
Array
(
[Reading] => Array
(
)
[Property] => Array
(
[type] => function
[name] => Student
)
)코드 설명
위 예제에서는 Student 함수에 #[Reading]과 #[Property] 두 개의 속성을 선언했습니다. 이후 ReflectionFunction으로 Student 함수의 리플렉션 객체를 생성하고, getAttributes() 메서드를 호출해 함수에 선언된 속성 목록을 가져옵니다.
반복문 안에서는 getName()으로 속성 이름을, getArguments()로 속성에 전달된 인자를 추출하여 하나의 연관 배열로 정리한 뒤 출력합니다. 실행 결과를 보면 인자가 없는 Reading 속성은 빈 배열로, type과 name 인자를 가진 Property 속성은 해당 값들이 담겨 반환된 것을 확인할 수 있습니다.
이처럼 리플렉션 API를 활용하면 코드에 선언된 메타데이터를 런타임에 동적으로 읽어올 수 있습니다. 이를 바탕으로 설정 기반 처리, 유효성 검사, 라우팅, 의존성 주입 등 다양한 고급 기능을 구현할 수 있습니다.