2017-03-08 111 views
2

我有以下枚舉:如何將php枚舉轉換爲數組?

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

如何修改下面的函數來生成基於上述enum一個數組?

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

爲此目的使用SplEnum不是更好嗎?

+2

您可以使用構建函數來填充數組.. – scaisEdge

+0

http://php.net/manual/en/class.splenum.php –

回答

1

我不確定使用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()); 

編輯:這裏是一個更加緊湊和高效的版本,它使用本地PHP函數getOptions功能:

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

如果'getOptions'不在擴展'DaysOfWeek'的類中? – Meysam

+0

@Meysam你可以參考DaysOfWeek而不是CLASS。我編輯了我的回覆以添加另一個示例。 –

+0

@Meysam是否適合你? –

0

你如果你願意,可以使用SplEnum,但我覺得很難使用。我更喜歡Eloquent Enumeration,因爲它支持C++樣式和Java樣式枚舉,並且有一系列獲取值的方法。

如果您想自己推出,可以使用ReflectionClass來檢查常量,但請注意,如果您有一個繼承樹添加常量,則必須是bit clever。否則,從S. Imp的答案運作良好。