枚举值在常量表达式中

由于枚举本身表示为常量,因此它们可以在大多数常量表达式中用作静态值:属性默认值、静态变量默认值、参数默认值、全局常量和类常量值。它们不能在其他枚举情况值中使用,但普通常量可以引用枚举情况。

但是,在静态或常量定义中不允许使用 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'];
// 致命错误:在常量表达式中不能对枚举使用 []
}

// 这完全合法,因为它不是常量表达式。
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));

$foo = new Foo();
?>
添加笔记

用户贡献笔记

此页面没有用户贡献的笔记。
To Top