我得到了以下枚举:
abstract class DaysOfWeek
{
const Sunday = 0;
const Monday = 1;
// etc.
}
如何修改以下函数以根据上面的enum
生成数组?
public function getOptions()
{
return [
0 => 'Sunday',
1 => 'Monday',
];
}
为此目的使用SplEnum
是否更好?
答案 0 :(得分:2)
我不确定使用Splenum是否更好,但我知道可以使用ReflectionClass来完成。假设您希望在扩展DaysOfWeek的类中定义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 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());
答案 1 :(得分:0)
如果您愿意,可以使用SplEnum
,但我觉得很难使用。我更喜欢Eloquent Enumeration,因为它支持C ++样式和Java样式枚举,并提供了一系列获取值的方法。
如果你想自己动手,可以使用ReflectionClass
来检查常量,但要注意,如果你有一个增加常量的继承树,你必须是{{3} }}。否则,bit clever的答案就足够了。