当前位置: 首页 > news >正文

php8 枚举使用教程

简介

PHP8.1 开始原生支持枚举(enum),这是 PHP 向类型安全和现代语言特性迈进的重要一步。枚举可以定义一组有穷的、不可变的常量集合,常用于表示状态值、选项类型等。

基础语法

PHP 支持两种类型的枚举:

纯枚举(Pure Enum)

纯枚举没有绑定值,仅代表自身:

enum Status {case Draft;case Published;case Archived;
}

使用:

$status = Status::Published;if ($status === Status::Draft) {echo '草稿';
}
具名枚举 / 带值枚举(Backed Enum)

带有标量值(stringint),可用于数据库或 API 等场景。

enum Role: string {case Admin = 'admin';case User = 'user';case Guest = 'guest';
}

使用:

$role = Role::Admin;echo $role->value; // 输出 'admin'

反查:

$role = Role::from('user');  // Role::User
$role = Role::tryFrom('unknown'); // null(安全版)

枚举常用方法和特性

  • ->name:获取枚举名(如 'Admin'

  • >value:获取值(仅限 Backed Enum

  • ::cases():返回所有枚举项数组

  • ::from($value):根据值获取枚举,找不到报错

  • ::tryFrom($value):根据值获取枚举,找不到返回 null

示例:

foreach (Role::cases() as $role) {echo $role->name . ' => ' . $role->value . PHP_EOL;
}

枚举 vs 常量类

比较点常量类枚举
类型安全❌ 无类型检查✅ 类型安全
IDE 智能提示一般更好
可迭代性::cases()
反向查找❌ 手动维护from()、tryFrom()
可扩展性✅ 支持方法、trait、接口等

枚举中添加方法

enum Status: string {case Draft = 'draft';case Published = 'published';case Archived = 'archived';public function label(): string {return match($this) {self::Draft => '草稿',self::Published => '已发布',self::Archived => '已归档',};}
}

与属性注解结合

结合 PHP 8 的属性,可以为枚举项注解:

use Attribute;#[Attribute]
class Label {public function __construct(public string $text) {}
}enum Status {#[Label('草稿')]case Draft;#[Label('发布')]case Published;#[Label('归档')]case Archived;
}

读取方式:

$ref = new ReflectionEnumUnitCase(Status::class, 'Draft');
$attrs = $ref->getAttributes(Label::class);
$label = $attrs[0]->newInstance()->text;echo $label; // 草稿

实战用途

  • 用户角色:enum Role: string { case Admin = 'admin'; ... }

  • 状态管理:enum OrderStatus { case New; case Shipped; }

  • 数据库映射:存储 enum->value,加载 Role::from($value)

  • 表单选项:枚举生成所有选项下拉框

注意事项

  • 枚举不能扩展(final),但可以实现接口、使用 trait

  • 不支持动态添加项;

  • 只能用 stringint 作为 BackedEnum 的类型;

  • 若用于持久化(如数据库),建议使用 BackedEnum

http://www.xdnf.cn/news/292987.html

相关文章:

  • 稀疏性预测算法初步
  • 健康养生:从微小改变开始
  • 【YOLO11改进】改进Conv、颈部网络STFEN、以及引入PIOU用于小目标检测!
  • 基于Vue3开发:打造高性能个人博客与在线投票平台
  • 【MATLAB例程】基于RSSI原理的Wi-Fi定位程序,N个锚点(数量可自适应)、三维空间,轨迹使用UKF进行滤波,附代码下载链接
  • 反射-探索
  • CASS 3D使用等高线修改插件导致修后等高线高程变化的问题
  • 当前人工智能领域的主流高级技术及其核心方向
  • 10.施工测量
  • 引领变革的“Vibe Coding”:AI辅助编程的崛起与挑战
  • 某信服EDR3.5.30.ISO安装测试(一)
  • printf的终极调试大法
  • 分析 Docker 磁盘占用
  • FTP/TFTP/SSH/Telnet
  • FastMCP - 快速、Pythonic风格的构建MCP server 和 client
  • [人机交互]交互设计
  • Qwen3的“混合推理”是如何实现的
  • Kotlin-空值和空类型
  • 【AI提示词】SCAMPER法专家
  • 【最新Python包管理工具UV的介绍和安装】
  • SIFT算法详细原理与应用
  • 嵌入式模数转换原理与程序设计
  • 新型深度神经网络架构:ENet模型
  • 《 深入探索移位操作符:从原理到应用》
  • ESP-ADF battery_service组件之voltage_monitor子模块详解
  • 分析rand()和srand()函数的功能
  • 【机器学习-线性回归-5】多元线性回归:概念、原理与实现详解
  • Android控件VideoView用法
  • 工业主义与民主的兴衰:历史逻辑与未来危机
  • 三种石墨烯(Graphene)拉伸模拟方法对比