PHP 8.1枚举:如何通过case名称字符串获取对应枚举实例
PHP 8.1枚举:根据Case名称获取实例及对应值
根据Case名称获取枚举实例
当你拿到的字符串是枚举case的名称(如"FOO")时,有几种可靠的方式获取对应枚举实例:
方法1:使用constant()函数
枚举的case本质是类常量,你可以通过constant()函数拼接类名和case名称来获取实例:
$caseName = "FOO"; $testInstance = constant("Test::$caseName"); // $testInstance 即为 Test::FOO
方法2:自定义静态方法(推荐)
在枚举类中添加一个fromName静态方法,封装查找逻辑,代码更易读且可复用:
enum Test: string { case FOO = 'baz'; case BAR = 'buz'; public static function fromName(string $name): self { foreach (self::cases() as $case) { if ($case->name === $name) { return $case; } } // 名称无效时抛出错误,和原生from()行为一致 throw new \ValueError("$name 不是枚举 " . self::class . " 的有效case名称"); } } // 使用示例 $testInstance = Test::fromName("FOO");
方法3:利用反射(适合复杂场景)
如果需要更灵活的处理,可以用PHP反射API获取所有case并匹配:
$caseName = "FOO"; $reflection = new \ReflectionEnum(Test::class); $testInstance = $reflection->getCase($caseName)->getValue();
根据Case名称获取对应Value
以Suit枚举为例,要从"Clubs"获取♣,只需先拿到枚举实例,再访问其value属性即可:
// 用constant方式 $suitInstance = constant("Suit::Clubs"); echo $suitInstance->value; // 输出 ♣ // 用自定义fromName方式(需给Suit添加同样的fromName方法) $suitInstance = Suit::fromName("Clubs"); echo $suitInstance->value; // 输出 ♣
关于Test::{$x}无效的说明
正常情况下Test::{$x}是可以直接获取case实例的,若无效可能是以下原因:
- 变量
$x的值拼写错误(枚举case名称严格区分大小写) - 代码上下文问题(比如在类内部未正确引用枚举类)
内容的提问来源于stack exchange,提问作者Stephen R
相关产品推荐
相关产品推荐

