속성(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_CLASS
  • Attribute::TARGET_FUNCTION
  • Attribute::TARGET_METHOD
  • Attribute::TARGET_PROPERTY
  • Attribute::TARGET_CLASS_CONSTANT
  • Attribute::TARGET_PARAMETER
  • Attribute::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
{
}