由于枚举本身的常量表示情况,它们可以在大多数常量表达式中用作静态值:属性默认值、静态变量默认值、参数默认值、全局和类常量值。它们不能用于其他枚举情况值,但普通常量可以引用枚举情况。
但是,诸如 ArrayAccess 上的枚举的隐式魔术方法调用在静态或常量定义中是不允许的,因为我们无法绝对保证结果值是确定性的,或者方法调用没有副作用。函数调用、方法调用和属性访问在常量表达式中仍然是无效的操作。
<?php
// 这是一个完全合法的枚举定义。
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
{
// 这是允许的。
const DOWN = Direction::Down;
// 这是不允许的,因为它可能不是确定性的。
const UP = Direction::Up['short'];
// Fatal error: Cannot use [] on enums in constant expression
}
// 这完全合法,因为它不是常量表达式。
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));
$foo = new Foo();
?>