PHP8 枚舉基礎

2023-08-18 13:44 更新

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"
?>

It is also possible to use the defined() and constant() functions to check for the existence of or read an enum case if the name is obtained dynamically. This is, however, discouraged as using Backed enums should work for most use cases.


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號