## 枚举基础

Enum 类似 class，它和 class、interface、trait 共享同样的命名空间。 也能用同样的方式自动加载。 一个 Enum 定义了一种新的类型，它有固定、数量有限、可能的合法值。

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

以上声明了新的枚举类型 `Suit`，仅有四个有效的值： `Suit::Hearts`、`Suit::Diamonds`、 `Suit::Clubs`、`Suit::Spades`。 变量可以赋值为以上有效值里的其中一个。 函数可以检测枚举类型，这种情况下只能传入类型的值。

`<?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`，且没有最大数量限制。 虽然零个 case 的 enum 没什么用处，但在语法上也是有效的。

枚举条目的语法规则适用于 PHP 中的任何标签，参见常量。

默认情况下，枚举的条目（case）本质上不是标量。 就是说 `Suit::Hearts` 不等同于 `"0"`。 其实，本质上每个条目是该名称对象的单例。具体来说：

`<?php
$a = Suit::Spades;
$b = Suit::Spades;
$a === $b; // true
$a instanceof Suit; // true
?>`

由于对象间的大小比较毫无意义，这也意味着 enum 值从来不会 `<` 或 `>` 其他值。当 enum 的值用于比较时，总是返回 `false`。

这类没有关联数据的条目（case），被称为“纯粹条目”（Pure Case）。 仅包含纯粹 Case 的 Enum 被称为纯粹枚举（Pure Enum）。

枚举类型里所有的纯粹条目都是自身的实例。枚举类型在内部的实现形式是 class。

所有的 case 有个只读的属性 `name`。 它大小写敏感，是 case 自身的名称。

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

如果名称是动态获取的，也可以使用 defined() 和 constant() 函数来检查枚举成员是否存在或读取其值。然而，这种方法并不推荐，因为对于大多数使用场景，使用带值枚举即可满足需求。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open