php 枚举上的变量键

问题描述 投票:0回答: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();
php enums php-8.1
1个回答
6
投票

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

  • property 将在类中声明为
    static $foo
    (具有可选的可见性、类型和默认值),并作为
    Example::$foo
    进行访问。动态地,您可以使用“变量-变量”语法来访问它,例如
    $name = 'foo'; echo Example::$$name;
  • constant 将被声明为
    const foo = 'value'
    (具有可选的可见性),并作为
    Example::foo
    进行访问。从 PHP 8.3 开始,您可以使用
    $name = 'foo'; echo Example::{$name};
    动态访问它。在早期版本中,没有直接语法,但您可以使用
    constant
    函数
    ,如
    $name = 'foo'; echo constant("Example::$name");
  • enum case 被声明为
    case foo
    (如果使用“支持的枚举”,则带有一个值),并且使用与类常量相同的语法来访问它。

事实上,枚举情况在很多方面都被视为常量,测试表明

constant
函数和 PHP 8.3 动态常量语法都可以用来查找,所以这是可行的:

enum ExampleEnum
{
    case _1;
    case _2;

    public function getIt(): string
    {
        return match ($this) {
            ExampleEnum::_1 => 'foo',
            ExampleEnum::_2 => 'bar',
        };
    }
}

$id = "_1";

// PHP 8.3 or later only:
echo ExampleEnum::{$id}->getIt();

// any version supporting enums (PHP 8.0 or later):
echo constant("ExampleEnum::$id")->getIt();

请注意,如果您使用 “支持枚举”,您可以将任意整数或字符串与每个案例相关联,与其名称分开,并使用

from
方法根据该值查找案例。

© www.soinside.com 2019 - 2024. All rights reserved.