W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
默認(rèn)情況下枚舉條目實現(xiàn)形式不是標(biāo)量。 它們是純粹的對象實例。 不過,很多時候也需要在數(shù)據(jù)庫、數(shù)據(jù)存儲對象中來回讀寫枚舉條目。 因此,能夠內(nèi)置支持標(biāo)量形式也很有用(更易序列化)。
按以下語法,定義標(biāo)量形式的枚舉:
<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
?>
由于有標(biāo)量的條目回退(Backed)到一個更簡單值,又叫回退條目(Backed Case)。 包含所有回退條目的 Enum 又叫“回退 Enum”(Backed Enum)。 回退 Enum 只能包含回退條目。 純粹 Enum 只能包含純粹條目。
回退枚舉僅能回退到 int 或 string 里的一種類型, 且同時僅支持使用一種類型(就是說,不能聯(lián)合 int|string)。 如果枚舉為標(biāo)量形式,所有的條目必須明確定義唯一的標(biāo)量值。 無法自動生成標(biāo)量(比如:連續(xù)的數(shù)字)。 回退條目必須是唯一的;兩個回退條目不能有相同的標(biāo)量。 然而,也可以用常量引用到條目,實際上是創(chuàng)建了個別名。 參見 枚舉常量。
條目等同的值,必須是個字面量或它的表達(dá)式。 不能是常量和常量表達(dá)式。 換言之,允許 1 + 1, 不允許 1 + SOME_CONST。
回退條目有個額外的只讀屬性 value, 它是定義時指定的值。
<?php
print Suit::Clubs->value;
// 輸出 "C"
?>
為了確保 value 的只讀性, 無法將變量傳引用給它。 也就是說,以下會拋出錯誤:
<?php
$suit = Suit::Clubs;
$ref = &$suit->value;
// Error: Cannot acquire reference to property Suit::$value
?>
回退枚舉實現(xiàn)了內(nèi)置的 BackedEnum interface, 暴露了兩個額外的方法:
from() 和 tryFrom() 方法也遵循基本的嚴(yán)格/松散類型規(guī)則。 系統(tǒng)在弱類型模式下接受傳入 integer 和 string,并自動強(qiáng)制轉(zhuǎn)換對應(yīng)值。 傳入 float 也能運(yùn)行,并且強(qiáng)制轉(zhuǎn)換。 在嚴(yán)格類型模式下,為 string 回退枚舉的 from() 傳入 integer 會導(dǎo)致 TypeError,反之亦然;float 都會出現(xiàn)有問題。 其他所有的參數(shù)類型,在以上所有模式中都會拋出 TypeError。
<?php
$record = get_stuff_from_database($id);
print $record['suit'];
$suit = Suit::from($record['suit']);
// 無效數(shù)據(jù)拋出 ValueError:"X" is not a valid scalar value for enum "Suit"
print $suit->value;
$suit = Suit::tryFrom('A') ?? Suit::Spades;
// 無效數(shù)據(jù)返回 null,因此會用 Suit::Spades 代替。
print $suit->value;
?>
手動為回退枚舉定義 from() 或 tryFrom() 方法會導(dǎo)致 fatal 錯誤。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: