PHP 8.1新特性实战:枚举与只读属性的革新应用
PHP 8.1带来了两项改变游戏规则的新特性:枚举(Enums)和只读属性(Readonly Properties)。这些特性不仅让代码更安全,也大大提升了开发体验。
枚举类型:告别常量数组的混乱
以往我们这样定义状态:
class Order {
const STATUS_PENDING = 0;
const STATUS_PROCESSING = 1;
const STATUS_COMPLETED = 2;
// 仍可能传入 3, 4, 5...
}
现在使用枚举:
enum OrderStatus {
case PENDING;
case PROCESSING;
case COMPLETED;
}
class Order {
public OrderStatus $status;
public function complete(): void {
$this->status = OrderStatus::COMPLETED;
}
}
枚举的优势:
- 类型安全:只能使用预定义的值
- 自带方法能力:枚举可以包含方法
- 完美配合类型声明
只读属性:不可变性的优雅实现
class User {
public readonly string $email;
public readonly DateTimeImmutable $createdAt;
public function __construct(string $email) {
$this->email = $email;
$this->createdAt = new DateTimeImmutable();
}
}
$user = new User('test@example.com');
// $user->email = 'new@example.com'; // 错误!不可重新赋值
只读属性的价值:
- 防止对象状态意外修改
- 明确设计意图,增强代码自描述性
- 减少因状态变化引发的bug
实战建议
- 枚举适用场景:状态机、配置选项、有限集合的值
- 只读属性适用场景:值对象、DTO、配置对象
- 组合使用:枚举+只读属性创建高度可预测的数据结构
这些新特性让PHP在类型系统和代码健壮性方面迈出了重要一步。建议在需要明确领域边界和状态管理的项目中优先采用枚举,在数据封装场景中使用只读属性,这将显著提升代码质量和可维护性。