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