PHP如何正确遍历enum枚举类型?
PHP 枚举遍历的标准实现方式
PHP 8.1 版本新增的原生枚举,已经内置了获取所有枚举项的静态方法cases(),不需要手动维护枚举项数组,是官方推荐的规范实现。
你之前写foreach (Shapes as $shape)报错,是因为Shapes是枚举类型名,本身不是可迭代结构,必须通过cases()方法拿到所有枚举case的数组后再遍历。
正确写法
直接调用枚举类的cases()静态方法即可遍历,返回的数组顺序和你在枚举类中定义case的顺序完全一致:
foreach (Shapes::cases() as $shape) { // 这里的$shape就是对应的枚举对象,比如Shapes::RECTANGLE var_dump($shape); }
适配场景
- 普通无值枚举(也就是你定义的这类基础枚举)可以直接用
- 绑定了int/string值的 backed 枚举(标量枚举)同样适用,遍历过程中可以通过
$shape->value获取每个case绑定的标量值,示例:
// 带值的标量枚举示例 enum Shapes: string { case RECTANGLE = 'rectangle'; case SQUARE = 'square'; case CIRCLE = 'circle'; case OVAL = 'oval'; } foreach (Shapes::cases() as $shape) { // 输出每个枚举绑定的字符串值 echo $shape->value . PHP_EOL; }
和手动写数组方案的对比
你之前手动维护枚举数组的方式,后续新增、删除、修改枚举case时,必须同步修改对应的数组配置,很容易出现枚举更新了但遍历数组没同步的bug。用原生cases()方法没有额外维护成本,枚举结构调整时遍历逻辑会自动适配,不会出现不一致问题。
内容的提问来源于stack exchange,提问作者ICE
相关产品推荐
相关产品推荐

