phpday 2022

Значения перечисления в постоянных выражениях

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

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

<?php
// Это полностью законное определение перечисления.
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
{
    
// Это разрешено.
    
const Bar Direction::Down;

    
// Это запрещено, так как не может быть детерминированным.
    
const Bar Direction::Up['short'];
    
// Fatal error: Cannot use [] on enums in constant expression
}

// Это совершенно законно, потому что это не постоянное выражение.
$x Direction::Up['short'];
?>
add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top