php 枚举上的变量键

med*_*ies 2 php enums php-8.1

是否可以动态访问枚举属性?

这是我尝试过的以及我得到的错误。

访问未声明的静态属性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();
Run Code Online (Sandbox Code Playgroud)

IMS*_*SoP 5

在这里区分三个不同的东西很重要:

  • 属性将在类中声明为static $foo(具有可选的可见性、类型和默认值),并以Example::$foo. 动态地,您可以使用“变量-变量”语法来访问它,例如$name = 'foo'; echo Example::$$name;.
  • 常量将被声明为const foo = 'value'(具有可选的可见性),并被访问为Example::foo. 没有直接访问它的直接语法,但您可以使用function constant$name = 'foo'; echo constant("Example::$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();
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用“支持枚举”,则可以将任意整数或字符串与每个案例关联起来,与其名称分开,并使用该from方法根据该值查找案例。