枚举类似于类,并与类、接口和特质共享相同的命名空间。它们也是以相同的方式自动加载的。枚举定义了一种新类型,该类型具有固定数量的可能合法值。
<?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
定义,没有最大值。零案例枚举在语法上是有效的,虽然它没有太大用处。
对于枚举案例,与任何 PHP 标签相同的语法规则适用,请参阅 常量。
默认情况下,案例本身并不与标量值相关联。也就是说,Suit::Hearts
不等于 "0"
。相反,每个案例都与一个该名称的单例对象相关联。这意味着
<?php
$a = Suit::Spades;
$b = Suit::Spades;
$a === $b; // true
$a instanceof Suit; // true
?>
这也意味着枚举值永远不会 <
或 >
彼此,因为这些比较对于对象来说没有意义。这些比较在使用枚举值时将始终返回 false
。
这种没有相关数据的案例类型被称为“纯案例”。仅包含纯案例的枚举被称为纯枚举。
所有纯案例都实现为其枚举类型的实例。枚举类型在内部表示为一个类。
所有案例都具有一个只读属性 name
,它是案例本身的区分大小写的名称。
<?php
print Suit::Spades->name;
// 输出 "Spades"
?>
也可以使用 defined() 和 constant() 函数来检查枚举案例是否存在或读取枚举案例,前提是名称是动态获取的。但是,不鼓励这样做,因为使用 支持的枚举 应该适用于大多数用例。