枚举类型高级用法:联合方法与状态机实现
利用PHP 8.1枚举支持方法和接口,设计有限状态机模型,替代冗长的if-else判断,提升代码可读性与扩展性。 · 难度:入门 · +10XP
枚举类型高级用法:联合方法与状态机实现
PHP枚举不仅仅是常量集合,它们可以拥有方法、实现接口甚至拥有抽象方法。本教程将设计一个支付订单状态机:Pending -> Paid -> Shipped -> Delivered。每个枚举case覆盖抽象方法canTransitionTo(),定义允许的状态转换。此外展示如何在枚举中存储与数据库映射关系,以及利用枚举作为策略模式的选择器,消除switch语句。
enum OrderStatus: string {
case Pending = 'pending';
case Paid = 'paid';
public function canTransitionTo(self $target): bool {
return match($this) {
self::Pending => $target === self::Paid,
self::Paid => $target === self::Shipped,
default => false,
};
}
public function label(): string {
return match($this) {
self::Pending => '待支付',
self::Paid => '已付款',
};
}
}
$status = OrderStatus::Pending;
if ($status->canTransitionTo(OrderStatus::Paid)) {
echo '允许转换';
}