如何将 php 枚举转换为数组?

How to convert php enum to array?

我有以下枚举:

abstract class DaysOfWeek
{
    const Sunday = 0;
    const Monday = 1;
    // etc.
}

如何修改下面的函数,根据上面的enum生成数组?

public function getOptions()
{
    return [
        0 => 'Sunday',
        1 => 'Monday',
    ];
}

为了这个目的使用SplEnum不是更好吗?

我不确定使用 Splenum 是否更好,但我知道这可以使用 ReflectionClass 来完成。假设您希望在扩展 DaysOfWeek 的 class 中定义 getOptions,您的代码可能如下所示:

abstract class DaysOfWeek
{
    const Sunday = 0;
    const Monday = 1;
    // etc.
}


class myClass extends DaysOfWeek {
    public function getOptions() {
            $oClass = new ReflectionClass(__CLASS__);
            $constants = $oClass->getConstants();
            $retval = array();
            foreach($constants as $name => $val) {
                    $retval[$val] = $name;
            }
            return $retval;
    }
}

$o = new myClass();
var_dump($o->getOptions());

编辑:这是 getOptions 函数的更紧凑和高效的版本,它使用本机 PHP 函数:

    public function getOptions() {
            $oClass = new ReflectionClass(__CLASS__);
            $constants = $oClass->getConstants();
            return(array_combine(array_values($constants), array_keys($constants)));
    }

编辑 2:如果 getOptions 在不扩展 DaysOfWeek 的 class 中,您可以像这样简单地引用 class 名称:

class AnotherClass {
    public function getOptions() {
            $oClass = new ReflectionClass(DaysOfWeek);
            $constants = $oClass->getConstants();
            return(array_combine(array_values($constants), array_keys($constants)));
    }
}

$o = new AnotherClass();
var_dump($o->getOptions());

喜欢可以用SplEnum,不过我觉得很难用。我更喜欢 Eloquent Enumeration 因为它支持 C++ 风格和 Java 风格的枚举,以及一​​系列获取值的方法。

如果您想自己推出,可以使用 ReflectionClass 检查常量,但请注意,如果您有一个添加常量的继承树,则必须是 bit clever. Otherwise, the answer from 效果很好。