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

PHP 8.1+ 引入的 枚举(Enum) 类型

PHP 8.1+ 引入的 枚举(Enum) 类型

PHP 8.1+ 引入的 枚举(Enum) 类型,用于定义订单的各种状态,并实现了一个简单的状态机(State Machine),控制订单状态只能按照合理的业务流程进行变更。

1. 枚举定义部分(5 个订单状态)

case PendingPayment = 1;  // 待支付
case Paid           = 2;  // 已支付
case Shipped        = 3;  // 已发货
case Completed      = 4;  // 已完成
case Cancelled      = 5;  // 已取消

这是在定义一个名为 OrderStatus 的枚举(enum),它有 5 个可能的值:

  • OrderStatus::PendingPayment → 值是 1,代表“待支付”
  • OrderStatus::Paid → 值是 2,代表“已支付”
  • OrderStatus::Shipped → 值是 3,代表“已发货”
  • OrderStatus::Completed → 值是 4,代表“已完成”
  • OrderStatus::Cancelled → 值是 5,代表“已取消”

这些值通常对应数据库里 status 字段存储的数字(比如 1、2、3...),这样既节省空间,又方便查询。

使用枚举的好处是:代码里不会出现魔法数字(magic number),写 OrderStatus::Paid 比直接写 2 更清晰、更安全。

2. 状态流转规则(状态机核心)

public function canTransitionTo(self $newStatus): bool
{return match ($this) {self::PendingPayment => in_array($newStatus, [self::Paid, self::Cancelled]),self::Paid           => in_array($newStatus, [self::Shipped, self::Cancelled]),self::Shipped        => $newStatus === self::Completed,self::Completed      => false,self::Cancelled      => false,default              => false,};
}

这个方法是枚举上的一个实例方法,意思是:当前状态$this)能不能合法地变成某个新状态$newStatus)?

它返回 true 表示“允许变更”,返回 false 表示“不允许,禁止变更”。

我们用大白话 + 图表来解释每一种情况:

当前状态($this) 允许变成的新状态($newStatus) 不允许变成的状态(会返回 false) 业务含义解释
待支付 (PendingPayment) 已支付 (Paid)
已取消 (Cancelled)
不能直接变成 已发货、已完成 用户还没付钱,只能支付成功或取消订单
已支付 (Paid) 已发货 (Shipped)
已取消 (Cancelled)
不能变成 待支付、已完成 钱已收到,可以发货,或者用户退款取消
已发货 (Shipped) 已完成 (Completed) 不能变成其他任何状态 货物在路上,只能等用户签收后完成
已完成 (Completed) 不允许变成任何状态 所有变更都不允许 订单结束了,不能再改
已取消 (Cancelled) 不允许变成任何状态 所有变更都不允许 订单已取消,不能再改

举例说明如何判断

假设当前订单状态是 待支付(1):

$current = OrderStatus::PendingPayment;$current->canTransitionTo(OrderStatus::Paid);      // 返回 true  → 允许变成“已支付”
$current->canTransitionTo(OrderStatus::Cancelled); // 返回 true  → 允许变成“已取消”
$current->canTransitionTo(OrderStatus::Shipped);   // 返回 false → 不允许直接变成“已发货”(没付钱怎么发货?)

假设当前是 已支付(2):

$current = OrderStatus::Paid;$current->canTransitionTo(OrderStatus::Shipped);   // true  → 可以发货
$current->canTransitionTo(OrderStatus::Cancelled); // true  → 可以退款取消
$current->canTransitionTo(OrderStatus::PendingPayment); // false → 不能退回“待支付”

假设当前是 已完成(4):

$current = OrderStatus::Completed;$current->canTransitionTo(任何状态); // 都返回 false → 彻底锁死,不能再改

为什么要有这个方法?(核心目的)

这正是你之前提到的规则:核心字段只允许状态驱动修改

在代码的其他地方(比如订单服务),修改状态前一定会先检查:

if (!$order->getStatus()->canTransitionTo($newStatus)) {throw new Exception("非法状态变更!");
}

这样就强制保证了:

  • 不会出现业务上不可能的状态跳转
  • 所有状态变更都是合法、可控的
  • 防止程序 bug 或恶意操作导致数据混乱

总结成一张状态流转图

待支付 (1)├──→ 已支付 (2)│      ├──→ 已发货 (3)│      │      └──→ 已完成 (4)  (结束)│      └──→ 已取消 (5)  (结束)└──→ 已取消 (5)  (结束)已完成 (4) 和 已取消 (5) 不能再变到任何状态

这就是一个典型的电商订单状态机。是生产环境中保护订单数据一致性的核心机制。



Don’t reinvent the wheel, library code is there to help.

欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。

http://www.jsqmd.com/news/362464/

相关文章:

  • 架构实战:基于边缘计算解决多机并发下的机器人梯控系统资源死锁问题
  • 《构建之法》阅读笔记:从理论到实操的软件工程指南
  • 基础差?看阿虎医考的执医课程好! - 医考机构品牌测评专家
  • 一文讲清:深度学习之自注意力机制剖析,建议收藏!
  • 毕业设计项目 stm32 RFID智能仓库管理系统(源码+硬件+论文)
  • 从宅家到随行!Plex+cpolar 解锁影音库远程访问新玩法
  • 2026年,RPA选型是否应该优先考虑国产信创厂商?
  • 当RPA长出“大脑”:选型的关键,是技术参数还是业务契合度?
  • MyBatis最佳实践
  • AI Agent记忆系统完全指南(超详细)从入门到精通,一篇收藏就够了!
  • ⓫⁄₁₄ ⟦ OSCP ⬖ 研记 ⟧ Windows权限提升 ➱ 滥用Windows特权实现提权
  • Java程序员如何高效阅读JDK源码?
  • 【快速检索 | JPCS出版 | 连续5届JPCS出版,EI稳定检索 】第六届能源工程、新能源材料与器件国际学术会议(NEMD 2026)
  • 基于微信小程序的粤语文化传播平台的设计与开发(源码+论文+部署+安装)
  • 数字员工通过AI销冠系统与AI提效软件系统提升企业销售效率与创新能力
  • 【拯救HMI】HMI导航逻辑:如何构建清晰的信息架构避免“迷路”
  • 2026国内最新医用面膜top5推荐!资质合规 + 场景匹配 + 临床验证 + 稳定供应,优质医用面膜权威榜单发布,专业修护助力肌肤健康 - 品牌推荐2026
  • 用新考纲的执医课程,推荐阿虎医考 - 医考机构品牌测评专家
  • 【快速检索 | Springer出版】第六届机械设计与仿真国际学术会议(MDS 2026)
  • 考临床执医推荐听谁的课? - 医考机构品牌测评专家
  • 【拯救HMI】工业软件,不该是审美的荒漠
  • 【快速检索 | SPIE出版 | 连续4年稳定EI检索 | ISBNISSN双刊号 | 双一流高校主办】第五届光学与机器视觉国际学术会议(ICOMV 2026)
  • 攻防世界-base编码
  • jd商品详情 API 接口- item_get_pro 全平台商品
  • 数据库原理--寒假学习
  • Infoseek字节探索赋能媒介投放:全链路技术架构解析与API实操指南
  • 破壁者:疆鸿智能让EtherNet/IP与CC-Link在橡胶厂共舞
  • OpenCSG 正式发布 OpenClaw × AgenticHub 企业级 OPC 平台
  • 龙蜥社区第七届理事大会召开,丁津泰、包云岗、章文嵩等专家加入第二届顾问团
  • OpenCSG x MemVerge战略社区合作共建企业级OpenClaw