Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 8 속성(Attributes) 완벽 정리: 문법과 실전 예제

속성(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를 통해 나중에 필요한 시점에 메타데이터를 조회하고 활용할 수 있게 해주는 강력한 도구입니다.