상수 표현식에서의 Enum 값

상수 표현식에서의 Enum 값 (Enum values in constant expressions)

enum case가 상수 표현식(constant expression)에서 어떻게 사용될 수 있는지를 다룹니다. case가 정적 값으로 쓰일 수 있는 문맥과, 허용되지 않는 암묵적 메서드 호출에 대해 살펴봅니다.

출처: Enum values in constant expressions

본문

case는 enum 자체의 상수로 표현되므로, 대부분의 상수 표현식에서 정적 값으로 사용될 수 있습니다: 속성 기본값, 정적 변수 기본값, 매개변수 기본값, 전역 및 클래스 상수 값 등. 다른 enum case 값에는 사용될 수 없지만, 일반 상수는 enum case를 참조할 수 있습니다.

<?php

// This is an entirely legal Enum definition.
enum Direction implements ArrayAccess
{
    case Up;
    case Down;

    public function offsetExists($offset): bool
    {
        return false;
    }

    public function offsetGet($offset): mixed
    {
        return null;
    }

    public function offsetSet($offset, $value): void
    {
        throw new Exception();
    }

    public function offsetUnset($offset): void
    {
        throw new Exception();
    }
}

class Foo
{
    // This is allowed.
    const DOWN = Direction::Down;

    // This is disallowed, as it may not be deterministic.
    const UP = Direction::Up['short'];
    // Fatal error: Cannot use [] on enums in constant expression
}

// This is entirely legal, because it's not a constant expression.
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));

$foo = new Foo();

다만 상수 표현식에서 enum에 대한 ArrayAccess 같은 암묵적 매직 메서드 호출은 허용되지 않습니다. 결과 값이 결정적이라고 절대적으로 보장할 수 없고, 메서드 호출에 부작용이 없다고 보장할 수 없기 때문입니다. 함수 호출, 메서드 호출, 속성 접근은 상수 표현식에서 계속 유효하지 않은 연산입니다.

더 알아보기

  • enum 상수 정의에 대한 자세한 내용은 열거형 상수를 참고하세요.
  • 일반 상수 표현식에 대한 규칙은 상수 표현식 문서를 읽어보세요.