概述
枚举允许开发人员定义一个自定义类型,仅限于离散数量的可能值之一。
- 在 PHP 中,枚举是一种特殊的对象。
- 枚举本身是一个类,其可能的用例都是该类的单实例对象。这意味着枚举用例是有效的对象,可以在任何可以使用对象的地方使用,包括类型检查。
- 枚举可以有零个或多个
case定义。零情况枚举在语法上有效,但毫无用处。 - 枚举最流行的示例是内置布尔类型,它是一种具有合法值
true和false的枚举类型。 - 枚举与类类似,与类、接口和特征共享相同的命名空间。它们也可以以相同的方式自动加载。
纯枚举
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
此声明创建了一个名为 Suit 的新枚举类型, 它有且只有四个合法值:Suit::Hearts、Suit::Diamonds、 Suit::Clubs 和 Suit::Spades。变量可以赋给其中一个合法值。
默认情况下,实例本质上不由标量值支持。也就是说,Suit::Hearts 不等于"0"。相反,每个实例都由该名称的单例对象支持。
所有实例都有一个只读属性 name,即实例本身的 区分大小写的名称。
支持枚举
默认情况下,枚举实例没有标量等效项。它们只是单例对象。 但是,在很多情况下,枚举实例需要能够往返于数据库或类似的数据存储区,因此,定义一个内置的标量等效项是有用的。
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
支持枚举可能由 int 或 string 类型支持,并且给定枚举一次仅支持一种类型(即不支持 int|string 的并集)。
支持枚举具有额外的只读属性value,它是 定义中指定的值。
枚举方法
枚举(纯枚举和支持枚举)可以包含方法,也可以实现接口。如果枚举实现了接口,则该接口的任何类型检查也将接受该枚举的所有情况。
interface Colorful
{
public function color(): string;
}
enum Suit implements Colorful
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
// Fulfills the interface contract.
public function color(): string
{
// 在方法内部,$this变量被定义并引用 Case 实例。
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
// Not part of an interface; that's fine.
public function shape(): string
{
return "Rectangle";
}
}
function paint(Colorful $c)
{
/* ... */
}
paint(Suit::Clubs); // Works
print Suit::Diamonds->shape(); // prints "Rectangle"
在此示例中, Suit 的所有四个实例都具有两个方法 color() 和 shape()。就调用代码和类型检查而言,它们的行为与任何其他对象实例完全相同。
方法可以是公共的、私有的或受保护的,但实际上私有的和受保护的方法是等效的,因为不允许继承。
静态方法
枚举也可能有静态方法。枚举本身的静态方法主要用于替代构造函数。
enum Size
{
case Small;
case Medium;
case Large;
public static function fromLength(int $cm): static
{
return match(true) {
$cm < 50 => static::Small,
$cm < 100 => static::Medium,
default => static::Large,
};
}
}
