속성(Attribute)은 다른 클래스, 함수, 클래스 메서드, 클래스 프로퍼티, 상수, 매개변수에 메타데이터를 추가하기 위해 사용하는 일종의 클래스입니다. 속성은 런타임 중에는 아무런 동작도 수행하지 않습니다.
속성은 코드 실행에 직접적인 영향을 주지 않지만, 리플렉션(Reflection) API를 통해 접근할 수 있습니다. PHP 8에서 도입된 속성 기능을 활용하면 다른 코드가 클래스의 프로퍼티나 메서드를 검사하고 분석할 수 있어, 프레임워크나 라이브러리 개발 시 매우 유용하게 활용됩니다.
PHP 8 속성의 주요 특징
- 하나의 선언에 두 개 이상의 속성을 지정할 수 있습니다.
- 클래스 이름을 자동으로 해석(resolve)할 수 있습니다.
- 속성은 네임스페이스(namespaced)를 사용할 수 있습니다.
- 매개변수를 0개 이상 가질 수 있습니다.
PHP 8 속성 문법
- PHP 8에서는 #[ ](해시 기호와 대괄호)를 사용하여 속성을 선언합니다.
- #[ ] 안에 쉼표(,)로 구분하여 여러 개의 속성을 한 번에 선언할 수 있습니다.
- 인수(arguments)는 선택 사항이며, 사용할 경우 반드시 괄호 ( ) 안에 작성해야 합니다.
- 인수는 리터럴 값(literal value) 또는 상수 표현식(constant expression)으로 지정할 수 있습니다.
속성 기본 문법
#[attribute]
다음은 클래스에 속성을 적용한 예입니다.
#[Attribute]
final class EmpClass {
}예제: 함수에 속성 적용
#[Attr('param')]
function Exam() {}예제: 클래스에 속성 적용
#[Attr('param')]
class Exam {}예제: 클래스 프로퍼티에 속성 적용
class Emp {
#[Attribute('param')]
public $name;
}예제: 클래스 상수에 속성 적용
class Emp {
#[Attribute('emp')]
private const EMP = 'emp';
}예제: 함수에 속성 적용
#[Attribute('emp')]
function exam() {}예제: 메서드 매개변수에 속성 적용
function emp(#[Attribute('param')] $name) {
}함수, 메서드, 매개변수, 상수에 속성을 활용한 종합 예제
아래 예제는 PHP 8의 속성을 클래스, 상수, 프로퍼티, 메서드, 익명 클래스, 함수, 클로저, 화살표 함수 등 다양한 요소에 적용하는 방법을 보여줍니다.
<?php
#[MyAttribute]
class Emp
{
#[MyAttribute]
public const EMP = 'emp';
#[MyAttribute]
public $a;
#[MyAttribute]
public function foo(#[MyAttribute] $dept) {}
}
$object = new #[MyAttribute] class() {};
#[MyAttribute]
function f() {}
$f1 = #[MyAttribute] function() {};
$f2 = #[MyAttribute] fn() => 1;
print_r($f1);
?>실행 결과
Closure Object ( )
위 출력 결과에서 볼 수 있듯이, 속성이 적용된 익명 함수는 Closure 객체로 반환됩니다. 속성은 이처럼 코드 동작에는 영향을 주지 않으면서도, 리플렉션 API를 통해 나중에 필요한 시점에 메타데이터를 조회하고 활용할 수 있게 해주는 강력한 도구입니다.