
本文旨在探讨在 PHP 中如何根据字符串值获取枚举(Enum)的对应案例。我们将重点介绍 `BackedEnum` 的原生 `tryFrom()` 方法,以及针对纯枚举(Pure Enum)没有显式字符串值时,如何通过自定义静态方法遍历枚举案例并匹配其名称来实现这一功能,并提供详细代码示例。
在 PHP 8.1 及更高版本中引入的枚举(Enums)为定义一组有限的、命名常量集合提供了一种强大且类型安全的方式。在实际应用中,我们经常需要根据一个字符串(例如,来自用户输入或数据库)来获取对应的枚举案例(Enum Case)。这在处理不同类型的枚举时,其实现方式有所不同。
如果您的枚举是“支持枚举”(Backed Enum),即每个枚举案例都关联了一个显式的标量值(字符串或整数),那么 PHP 提供了一个非常方便的原生方法来根据这些值获取枚举案例。
什么是 Backed Enum? Backed Enum 的每个案例都必须声明一个唯一的标量值。例如:
<?php
enum Status: string // 声明为 Backed Enum,支持字符串值
{
case OK = "OK";
case FAILED = "FAILED";
case PENDING = "PENDING";
}
?>获取枚举案例 对于 Backed Enum,可以使用 tryFrom() 或 from() 方法根据其关联的字符串或整数值来获取对应的枚举案例。
示例代码:
<?php
enum Status: string
{
case OK = "OK";
case FAILED = "FAILED";
case PENDING = "PENDING";
}
// 使用 tryFrom()
$statusFromOk = Status::tryFrom("OK"); // 返回 Status::OK
$statusFromPending = Status::tryFrom("PENDING"); // 返回 Status::PENDING
$statusFromInvalid = Status::tryFrom("UNKNOWN"); // 返回 null
var_dump($statusFromOk);
var_dump($statusFromInvalid);
// 使用 from() (会抛出异常,通常需要try-catch)
try {
$statusFromFailed = Status::from("FAILED"); // 返回 Status::FAILED
var_dump($statusFromFailed);
$statusFromNonExistent = Status::from("NON_EXISTENT"); // 抛出 ValueError
} catch (ValueError $e) {
echo "Error: " . $e->getMessage() . "\n";
}
?>这种方式是获取 Backed Enum 案例的首选方法,因为它简洁、高效且是 PHP 原生支持的。
什么是 Pure Enum? 纯枚举(Pure Enum)的案例没有显式关联的标量值。它们仅仅是命名常量。例如:
<?php
enum Action // 纯枚举,没有声明 : string 或 : int
{
case CREATE;
case READ;
case UPDATE;
case DELETE;
}
?>对于纯枚举,tryFrom() 和 from() 方法是不可用的,因为它们没有底层值可供匹配。然而,每个枚举案例都有一个内部的名称(name)属性,它是一个字符串,与声明的案例名称完全一致。例如,Action::CREATE->name 将返回字符串 "CREATE"。
问题: 如何根据一个字符串(例如 "CREATE")来获取 Action::CREATE 这个枚举案例?
GitFluence
AI驱动的Git命令生成器,可帮助您快速找到正确的命令
88
查看详情
解决方案: 由于没有原生方法,我们需要编写一个自定义的静态方法来遍历所有可用的枚举案例,并将其 name 属性与输入的字符串进行比较。
实现自定义 get() 方法
我们可以在枚举内部添加一个静态方法,例如 get(),来封装这个逻辑:
<?php
enum Status
{
case OK;
case FAILED;
case PENDING;
/**
* 根据字符串名称获取对应的枚举案例。
* 支持大小写不敏感和去除空格。
*
* @param string $name 要查找的枚举案例名称。
* @return self|null 匹配的枚举案例,如果未找到则返回 null。
*/
public static function get(string $name): ?self
{
// 对输入名称进行预处理,例如转换为大写并去除首尾空格,
// 以实现更灵活的匹配。
$normalizedName = strtoupper(trim($name));
if (empty($normalizedName)) {
return null; // 空字符串无法匹配
}
// 遍历所有枚举案例
foreach (self::cases() as $status) {
// 比较当前案例的名称与标准化后的输入名称
if ($status->name === $normalizedName) {
return $status;
}
}
return null; // 未找到匹配的案例
}
}
// 使用自定义的 get() 方法
$statusOk = Status::get("OK"); // 返回 Status::OK
$statusFailed = Status::get("failed"); // 返回 Status::FAILED (由于 strtoupper)
$statusPending = Status::get(" PENDING "); // 返回 Status::PENDING (由于 trim)
$statusInvalid = Status::get("UNKNOWN"); // 返回 null
var_dump($statusOk);
var_dump($statusFailed);
var_dump($statusPending);
var_dump($statusInvalid);
// 访问枚举案例的名称属性
echo "Status::OK 的名称是: " . Status::OK->name . "\n"; // 输出 "OK"
?>代码解析:
如果你的枚举案例需要关联一个唯一的、可用于查找的字符串或整数值,优先考虑使用 Backed Enum。这将允许你利用原生的 tryFrom() 方法,代码更简洁且性能更优。通过理解 Backed Enums 的原生 tryFrom() 方法和为纯枚举实现自定义 get() 方法,你可以在 PHP 中灵活高效地根据字符串值获取所需的枚举案例,从而提高代码的可读性和健壮性。
以上就是PHP 枚举:根据字符串获取枚举案例的策略与实现的详细内容,更多请关注php中文网其它相关文章!
# 方法来
# 湖南日语网站建设推荐
# 镇江推荐网站推广优化
# 嘉兴品牌seo推广
# 服装网站建设价格低
# 百度推广是seo
# 网站建设难点在哪
# seo提高关键词排名
# 运城网站建设厂家名单
# 无锡网站怎样优化
# 杨浦营销推广合作企业名单
# php
# 它将
# 转换为
# 找不到
# 你可以
# 字符串值
# 都有
# 抛出
# 遍历
# 自定义
# ai
相关文章:
Linux如何构建多环境配置管理_Linux多环境配置方案
4399体育竞技小游戏_4399小游戏赛事入口
在WordPress中通过REST API获取BasicAuth保护的远程文章
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
win11跳过OOBE三种方法 Win11跳过OOBE设置步骤
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
UC浏览器官网入口2025最新 UC浏览器网页版正式地址
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
excel怎么提取文本中数字 excel函数提取技巧
AO3最新入口2025公告_AO3中文官网合集
mc.js免安装版 mc.js一键畅玩入口
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
理解J*aScript Promise的微任务队列与执行顺序
从OpenAI API响应中高效提取生成文本
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
AO3最新可访问网址 Archive of Our Own官方在线入口
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
Android Studio计算器C键功能异常排查与修复教程
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
如何有效阻止外部脚本意外修改内联样式的高度属性
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
处理Kafka消息时会话超时与实现幂等性消费者
qq游戏大厅官方下载_qq游戏免费下载安装入口
必由学官方网站入口 必由学学生教师共用登录通道
QQ官网正版登录链接 QQ在线登录入口最新
J*a实现学校排课程序_面向对象结构化项目示例
J*aScript中向JSON对象添加新属性的正确姿势
PHP表单提交后函数重复执行的解决方案:管理$_POST数据
J*aScript中针对特定容器内图片动画的实现教程
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
谷歌google账号注册详细步骤 谷歌账号注册官方教程
必由学官方平台入口 必由学在线课堂登录地址
PostgreSQL海量数据高效导入策略:Python与Django实践指南
Golang如何使用new_Go new分配内存机制讲解
使用Python高效删除Word宏并转换DOCM为DOCX格式
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
谷歌google账号怎么注册账号 谷歌账号注册官方流程
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落
反效果?《战地6》免费试玩开启后玩家数不升反降
深入理解与实现最大堆的Heapify过程:常见错误与修正
如何在 Windows 11 中启动游戏手柄设置
微信网页版扫码登录入口 微信网页版二维码登录入口
*请认真填写需求信息,我们会在24小时内与您取得联系。