枚举方法

枚举(纯枚举和支持枚举)可以包含方法,并且可以实现接口。如果枚举实现了接口,则对该接口的任何类型检查也将接受该枚举的所有情况。

<?php

interface Colorful
{
public function
color(): string;
}

enum
Suit implements Colorful
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;

// 满足接口契约。
public function color(): string
{
return match(
$this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}

// 不是接口的一部分;没关系。
public function shape(): string
{
return
"Rectangle";
}
}

function
paint(Colorful $c)
{
/* ... */
}

paint(Suit::Clubs); // 工作

print Suit::Diamonds->shape(); // 打印 "Rectangle"
?>

在这个例子中,Suit 的所有四个实例都有两个方法,color()shape()。就调用代码和类型检查而言,它们的行为与任何其他对象实例完全相同。

在支持的枚举上,接口声明位于支持类型声明之后。

<?php

interface Colorful
{
public function
color(): string;
}

enum
Suit: string implements Colorful
{
case
Hearts = 'H';
case
Diamonds = 'D';
case
Clubs = 'C';
case
Spades = 'S';

// 满足接口契约。
public function color(): string
{
return match(
$this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
}
?>

在方法内部,$this 变量被定义,并引用 Case 实例。

方法可以任意复杂,但在实践中通常会返回一个静态值,或者match $this 以针对不同的情况提供不同的结果。

注意,在这种情况下,更好的数据建模实践是还定义一个具有 Red 和 Black 值的 SuitColor 枚举类型,并返回该类型。但是,这将使本示例复杂化。

上面的层次结构在逻辑上类似于以下类结构(尽管这不是实际运行的代码)

<?php

interface Colorful
{
public function
color(): string;
}

final class
Suit implements UnitEnum, Colorful
{
public const
Hearts = new self('Hearts');
public const
Diamonds = new self('Diamonds');
public const
Clubs = new self('Clubs');
public const
Spades = new self('Spades');

private function
__construct(public readonly string $name) {}

public function
color(): string
{
return match(
$this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}

public function
shape(): string
{
return
"Rectangle";
}

public static function
cases(): array
{
// 非法方法,因为不允许在枚举上手动定义 cases() 方法。
// 另请参见“值列表”部分。
}
}
?>

方法可以是 public、private 或 protected,尽管在实践中 private 和 protected 是等效的,因为不允许继承。

添加注释

用户贡献的注释 1 注释

iloveyii at yahoo dot com
1 年前
只是为了在上面的简洁示例中完成函数 shape

<?php
interface Colorful
{
public function
color(): string;
}

enum
Suit implements Colorful
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;

// 满足接口契约。
public function color(): string
{
return match(
$this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}

// 不属于接口的一部分;这很好。
public function shape(): string
{
return match(
$this) {
Suit::Hearts => '❤️',
Suit::Diamonds => '💎',
Suit::Clubs => '♣️',
Suit::Spades => ' ♠️'
};

}
}

echo
Suit::Diamonds->shape();
echo
PHP_EOL;
echo
Suit::Clubs->shape();
To Top