Поскольку случаи представлены как константы в самом перечислении, они могут использоваться как статические значения в большинстве константных выражений: значения по умолчанию для свойств, значения по умолчанию для статических переменных, значения по умолчанию для параметров, глобальные значения и значения констант класса. Их нельзя использовать в других значениях регистра перечисления, но обычные константы могут относиться к регистру перечисления.

Однако неявные вызовы магических методов, таких как ArrayAccess для перечислений, не разрешены в статических или константных определениях, поскольку мы не можем абсолютно гарантировать, что результирующее значение является детерминированным или что вызов метода свободен от побочных эффектов. Вызовы функций, вызовы методов и доступ к свойствам по-прежнему являются недопустимыми операциями в константных выражениях.

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

    public function offsetGet($val) { ... }
    public function offsetExists($val) { ... }
    public function offsetSet($val) { throw new Exception(); }
    public function offsetUnset($val) { throw new Exception(); }
}

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

    // This is disallowed, as it may not be deterministic.
    const Bar = 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'];
?>