在 PHP 中可变地将字符串类型转换为枚举

Variably typecasting strings to Enums in PHP

提问人:Jesse 提问时间:10/18/2022 更新时间:10/18/2022 访问量:93

问:

假设我有两个后备枚举:

enum Colors: string
{
    case Blue = "blue";
    case Red = "red";
}

enum Fruits: string
{
    case Apple = "apple";
    case Pear = "pear";
}

在我实际的 Yii2 实现中,我想将变量对象属性类型转换为属性类型。在数据库中,我将值存储为字符串,例如“blue”和“apple”,我想将其转换为枚举。在我的自定义所谓的“Yii2 Behavior”的变量初始化中,我传递了多个参数,比如,告诉行为哪个枚举要解析某些属性。此时,行为还不知道任何实际值。[color => Colors::class, fruit => Fruit::class]

在“行为”中,函数以 和 结尾,其中例如 和(这是 的结果)。我希望这个函数返回。$value$type$value === "blue"$type === "Namespace\Colors"Colors::classenum Namespace\Colors::Blue

我试过了

if($type instanceof \BackedEnum) {
    return $type::from($value);
}

这显然失败了,因为$type只是一个字符串。

所以我试过了

if((new ($type)) instanceof \BackedEnum) {
    return $type::from($value);
}

失败。Cannot instantiate enum 'Namespace\Colors'

我被困在这个上,有人知道如何解决这种情况吗?我可以以不同的方式传递或处理什么,以可变地将字符串类型转换为枚举?多

PHP 枚举 转换

评论


答:

2赞 shingo 10/18/2022 #1

从代码来看,因为是一个字符串,你不能对字符串调用方法,你需要一些函数来运行它。$typecall_user_func

call_user_func([$type, 'from'], $value);