本文目录导读:

是的,PHP 8.1+ 正式支持枚举(Enum),并且枚举验证也支持多种类型,以下是详细说明:
基础枚举验证
纯枚举类型
enum Status {
case Pending;
case Approved;
case Rejected;
}
function processStatus(Status $status): void {
// 类型安全验证
match($status) {
Status::Pending => echo "等待处理",
Status::Approved => echo "已批准",
Status::Rejected => echo "已拒绝",
};
}
// 调用
processStatus(Status::Pending); // 正确
// processStatus('Pending'); // 类型错误,会抛出 TypeError
回退枚举(Backed Enum)
字符串回退
enum OrderStatus: string {
case Pending = 'pending';
case Approved = 'approved';
case Cancelled = 'cancelled';
}
// 验证字符串值
function validateStatus(string $value): ?OrderStatus {
return OrderStatus::tryFrom($value);
}
// 使用 tryFrom 进行安全转换
$status = OrderStatus::tryFrom('pending'); // OrderStatus::Pending
$invalid = OrderStatus::tryFrom('unknown'); // null
整数回退
enum HttpStatus: int {
case OK = 200;
case NotFound = 404;
case ServerError = 500;
}
function getHttpStatus(int $code): HttpStatus {
return HttpStatus::from($code); // 会抛出 ValueError 如果无效
}
// tryFrom 安全版本
function safeGetStatus(int $code): ?HttpStatus {
return HttpStatus::tryFrom($code);
}
类型验证场景
表单验证示例
enum UserRole: string {
case Admin = 'admin';
case Editor = 'editor';
case Viewer = 'viewer';
public static function validValues(): array {
return array_column(self::cases(), 'value');
}
}
// 表单验证
function validateRole(string $role): bool {
return in_array($role, UserRole::validValues());
}
// 或使用直接转换
function processForm(array $data): void {
$role = UserRole::tryFrom($data['role'] ?? '');
if ($role === null) {
throw new InvalidArgumentException('无效的用户角色');
}
// 处理有效角色
echo $role->value; // admin, editor, viewer
}
高级类型验证模式
带方法的枚举验证
enum PaymentMethod: string {
case CreditCard = 'credit_card';
case PayPal = 'paypal';
case BankTransfer = 'bank_transfer';
public static function validate(string $method): bool {
return !is_null(self::tryFrom($method));
}
public static function isValidForRegion(string $method, string $region): bool {
$enum = self::tryFrom($method);
if (!$enum) {
return false;
}
return match($enum) {
self::PayPal => in_array($region, ['US', 'EU']),
self::BankTransfer => true,
default => true,
};
}
}
// 使用
if (PaymentMethod::validate('paypal')) {
echo "有效的支付方式";
}
多个值验证
enum Permission: int {
case Read = 1;
case Write = 2;
case Execute = 4;
case Delete = 8;
public static function fromBitmask(int $mask): array {
$permissions = [];
foreach (self::cases() as $permission) {
if ($mask & $permission->value) {
$permissions[] = $permission;
}
}
return $permissions;
}
}
// 验证权限位掩码
$userPermissions = Permission::fromBitmask(7); // [Read, Write, Execute]
JSON 序列化验证
enum ApiVersion: string {
case V1 = '1.0';
case V2 = '2.0';
case V3 = '3.0';
public static function fromRequest(string $version): self {
$normalized = match(true) {
str_starts_with($version, 'v1') => '1.0',
str_starts_with($version, 'v2') => '2.0',
str_starts_with($version, 'v3') => '3.0',
default => throw new InvalidArgumentException('不支持的 API 版本'),
};
return self::from($normalized);
}
}
// JSON 输入验证
$json = '{"version": "v2", "data": {...}}';
$input = json_decode($json, true);
$version = ApiVersion::fromRequest($input['version']);
框架集成示例(Laravel)
// 自定义验证规则
use Illuminate\Validation\Rule;
$rules = [
'status' => ['required', Rule::enum(OrderStatus::class)],
'role' => ['required', Rule::in(UserRole::validValues())],
];
// 或使用类型绑定
Route::get('/users/{role}', function (UserRole $role) {
return "角色: " . $role->value;
});
PHP 8.1+ 的枚举提供了完善的类型验证支持:
- 编译时类型检查:参数类型声明
- 运行时验证:
tryFrom()方法 - 自定义验证逻辑:枚举方法
- 多种回退类型:string、int
- 框架集成:Laravel 等框架原生支持
建议在需要固定值集合验证的场景优先使用枚举,它能提供更好的类型安全性和代码可读性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播