如何迭代枚举

ICE*_*ICE 13 php enums php-8.1

我想迭代枚举:

enum Shapes
{
    case RECTANGLE;
    case SQUARE;
    case CIRCLE;
    case OVAL;
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会得到Shapesconst not Defined:

foreach (Shapes as $shape) { }
Run Code Online (Sandbox Code Playgroud)

我提出的最佳解决方案是手动创建枚举数组:

$shapes = [
    Shapes::RECTANGLE,
    Shapes::SQUARE,
    Shapes::CIRCLE,
    Shapes::OVAL,
];
foreach ($shapes as $shape) { }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来迭代枚举?

KIK*_*are 34

您可以使用case()在枚举上生成案例列表,如下所示:

enum Shapes
{
    case RECTANGLE;
    case SQUARE;
    case CIRCLE;
    case OVAL;
}

foreach (Shapes::cases() as $shape) { 
    echo $shape->name . "\n";
}
Run Code Online (Sandbox Code Playgroud)

其输出是:

RECTANGLE
SQUARE
CIRCLE
OVAL
Run Code Online (Sandbox Code Playgroud)

适用于 PHP 8.1 及更高版本。

请参阅:PHP 小提琴


小智 5

您可以尝试Shapes::cases(),它返回给定枚举的所有情况的数组。