枚舉基礎(chǔ)

Enum 類(lèi)似 class,它和 class、interface、trait 共享同樣的命名空間。 也能用同樣的方式自動(dòng)加載。 一個(gè) Enum 定義了一種新的類(lèi)型,它有固定、數(shù)量有限、可能的合法值。

<?php
enum Suit
{
    case 
Hearts;
    case 
Diamonds;
    case 
Clubs;
    case 
Spades;
}
?>

以上聲明了新的枚舉類(lèi)型 Suit,僅有四個(gè)有效的值: Suit::Hearts、Suit::Diamonds、 Suit::ClubsSuit::Spades。 變量可以賦值為以上有效值里的其中一個(gè)。 函數(shù)可以檢測(cè)枚舉類(lèi)型,這種情況下只能傳入類(lèi)型的值。

<?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,且沒(méi)有最大數(shù)量限制。 雖然零個(gè) case 的 enum 沒(méi)什么用處,但在語(yǔ)法上也是有效的。

枚舉條目的語(yǔ)法規(guī)則適用于 PHP 中的任何標(biāo)簽,參見(jiàn)常量

默認(rèn)情況下,枚舉的條目(case)本質(zhì)上不是標(biāo)量。 就是說(shuō) Suit::Hearts 不等同于 "0"。 其實(shí),本質(zhì)上每個(gè)條目是該名稱(chēng)對(duì)象的單例。具體來(lái)說(shuō):

<?php
$a 
Suit::Spades;
$b Suit::Spades;

$a === $b// true

$a instanceof Suit;  // true
?>

由于對(duì)象間的大小比較毫無(wú)意義,這也意味著 enum 值從來(lái)不會(huì) <> 其他值。 當(dāng) enum 的值用于比較時(shí),總是返回 false。

這類(lèi)沒(méi)有關(guān)聯(lián)數(shù)據(jù)的條目(case),被稱(chēng)為“純粹條目”(Pure Case)。 僅包含純粹 Case 的 Enum 被稱(chēng)為純粹枚舉(Pure Enum)。

枚舉類(lèi)型里所有的純粹條目都是自身的實(shí)例。 枚舉類(lèi)型在內(nèi)部的實(shí)現(xiàn)形式是一個(gè) class。

所有的 case 有個(gè)只讀的屬性 name。 它大小寫(xiě)敏感,是 case 自身的名稱(chēng)。

<?php
print Suit::Spades->name;
// 輸出 "Spades"
?>