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'];
?>