속성(Attribute) 클래스 선언하기
속성(Attribute) 클래스 선언하기
속성은 클래스 하나당 하나씩, 각각 따로 정의하는 것을 권장해요. 가장 단순한 경우에는 #[Attribute] 선언만 붙어 있는 빈 클래스면 충분하죠. 이 속성은 use 문으로 전역 네임스페이스에서 불러올 수 있어요.
예제 1 — 단순한 속성 클래스
<?php
namespace Example;
use Attribute;
#[Attribute]
class MyAttribute
{
}
속성이 적용될 수 있는 선언의 종류를 제한하고 싶다면, #[Attribute] 선언의 첫 번째 인자로 비트마스크(bitmask)를 넘겨주면 돼요.
예제 2 — target 지정으로 속성을 사용할 수 있는 곳 제한하기
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class MyAttribute
{
}
이제 다른 타입 위에 MyAttribute를 선언하면, ReflectionAttribute::newInstance()를 호출하는 순간 예외가 던져져요.
지정할 수 있는 대상(target)은 다음과 같아요.
Attribute::TARGET_CLASSAttribute::TARGET_FUNCTIONAttribute::TARGET_METHODAttribute::TARGET_PROPERTYAttribute::TARGET_CLASS_CONSTANTAttribute::TARGET_PARAMETERAttribute::TARGET_ALL
기본적으로 속성은 선언마다 한 번만 사용할 수 있어요. 같은 선언에 여러 번 붙일 수 있게 하려면, #[Attribute] 선언의 비트마스크에 Attribute::IS_REPEATABLE 플래그를 함께 넣어주면 됩니다.
예제 3 — IS_REPEATABLE로 같은 선언에 속성을 여러 번 허용하기
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}