基本枚举

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

<?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 定义,没有最大值。零案例枚举在语法上是有效的,虽然它没有太大用处。

对于枚举案例,与任何 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() 函数来检查枚举案例是否存在或读取枚举案例,前提是名称是动态获取的。但是,不鼓励这样做,因为使用 支持的枚举 应该适用于大多数用例。

添加注释

用户贡献的注释

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