是否可以动态访问枚举属性?
这是我尝试过的方法以及遇到的错误。
Access to undeclared static property ExampleEnum::$id
enum ExampleEnum
{
case _1;
case _2;
public function getIt(): string
{
return match ($this) {
ExampleEnum::_1 => 'foo',
ExampleEnum::_2 => 'bar',
};
}
}
$id = "_1";
ExampleEnum::$id->getIt();
最佳答案
这里区分三个不同的东西很重要:
- 类属性将在类中声明为
static $foo
(具有可选的可见性、类型和默认值),并按示例进行访问: :$foo
。动态地,您可以使用“变量-变量”语法来访问它,例如$name = 'foo'; echo 示例::$$name;
. - 类constant将被声明为
const foo = 'value'
(具有可选的可见性),并以Example::foo
的形式访问。没有直接访问它的直接语法,但您可以使用 theconstant
function ,如$name = 'foo'; echo 常量("示例::$name");
- 枚举案例被声明为
case foo
(如果使用“支持枚举”则带有一个值),并且使用与类常量相同的语法来访问它.
事实上,它在很多方面都被视为常量,并且测试表明 constant
函数实际上可以用于查找一个,因此这是可行的:
enum ExampleEnum
{
case _1;
case _2;
public function getIt(): string
{
return match ($this) {
ExampleEnum::_1 => 'foo',
ExampleEnum::_2 => 'bar',
};
}
}
$id = "_1";
echo constant("ExampleEnum::$id")->getIt();
请注意,如果您使用 "backed enumeration" ,您可以将任意整数或字符串与每个案例关联起来,与其名称分开,并使用 from
方法根据该值查找案例。
关于php - php 枚举上的变量键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73129098/