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