PHP Conference Japan 2024

基本枚举

枚举类似于类,并且与类、接口和特质共享相同的命名空间。它们也以相同的方式可自动加载。枚举定义了一种新类型,该类型具有固定数量的可能合法值。

<?php

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

此声明创建一个名为Suit的新枚举类型,它具有四个且仅有四个合法值:Suit::HeartsSuit::DiamondsSuit::ClubsSuit::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。但是,不建议这样做,因为使用支持枚举应该适用于大多数用例。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top