Enum values in constant expressions

Оновлено: 09.05.2023

Оскільки регістри представлені як константи у самому переліку, їх можна використовувати як статичні значення у більшості константних виразів: властивості за замовчуванням, статичні змінні за замовчуванням, параметри за замовчуванням, глобальні та класові константні значення. Їх не можна використовувати в інших значеннях перечислення, але звичайні константи можуть посилатися на перечислення.

Однак, неявні виклики магічних методів, такі як 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'];
?>