Enum 類似 class,它和 class、interface、trait 共享同樣的命名空間。 也能用同樣的方式自動加載。 一個 Enum 定義了一種新的類型,它有固定、數(shù)量有限、可能的合法值。
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
?>
以上聲明了新的枚舉類型 Suit
,僅有四個有效的值:
Suit::Hearts
、Suit::Diamonds
、
Suit::Clubs
、Suit::Spades
。
變量可以賦值為以上有效值里的其中一個。
函數(shù)可以檢測枚舉類型,這種情況下只能傳入類型的值。
<?php
function pick_a_card(Suit $suit) { ... }
$val = Suit::Diamonds;
// OK
pick_a_card($val);
// OK
pick_a_card(Suit::Clubs);
// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');
?>
一個枚舉可以定義零個或多個case
,且沒有最大數(shù)量限制。
雖然零個 case 的 enum 沒什么用處,但在語法上也是有效的。
枚舉條目的語法規(guī)則適用于 PHP 中的任何標簽,參見常量。
默認情況下,枚舉的條目(case)本質(zhì)上不是標量。
就是說 Suit::Hearts
不等同于 "0"
。
其實,本質(zhì)上每個條目是該名稱對象的單例。具體來說:
<?php
$a = Suit::Spades;
$b = Suit::Spades;
$a === $b; // true
$a instanceof Suit; // true
?>
由于對象間的大小比較毫無意義,這也意味著 enum 值從來不會 <
或 >
其他值。
當 enum 的值用于比較時,總是返回 false。
這類沒有關聯(lián)數(shù)據(jù)的條目(case),被稱為“純粹條目”(Pure Case)。 僅包含純粹 Case 的 Enum 被稱為純粹枚舉(Pure Enum)。
枚舉類型里所有的純粹條目都是自身的實例。 枚舉類型在內(nèi)部的實現(xiàn)形式是一個 class。
所有的 case 有個只讀的屬性 name
。
它大小寫敏感,是 case 自身的名稱。
<?php
print Suit::Spades->name;
// 輸出 "Spades"
?>