php - php 枚举上的变量键

标签 php enums php-8.1

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

这是我尝试过的方法以及遇到的错误。

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的形式访问。没有直接访问它的直接语法,但您可以使用 the constant 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/

相关文章:

php - 时间戳比较 MySQL PHP

php - codeigniter,从模型回显数据以查看 PHP

java - 无法使用php exec函数执行java程序

php - 使用 Bootstrap 时不起作用

java - 我虽然我知道关于 Enum 的一切,但是它是如何工作的

enums - DART - 我可以将字符串转换为枚举吗?

java - 消息包中的枚举标签

php 8.1 - 旧脚本中弃用的返回类型

php - 如果字符串中间包含很多空格,/\s+$/u 的表现会非常糟糕