php 8.1 引入原生枚举,推荐用字符串枚举定义状态码,支持类型安全、ide 提示、序列化及 match 表达式;可扩展方法封装逻辑,并无缝集成 json/api 响应与现代框架。

PHP 8.1 引入了原生枚举(Enum),为状态码这类固定、语义明确的值提供了类型安全、可读性强且易于维护的表达方式。相比传统定义常量或数组,枚举能防止非法值传入、支持 IDE 智能提示、可直接序列化,并天然具备类型约束能力。
定义状态码枚举类
用 enum 关键字声明,推荐使用 string-backed enum(字符串枚举),便于 JSON 序列化、日志记录和 API 返回;若需数值运算或数据库存储整型,也可选 int-backed enum。
示例(字符串枚举):
enum HttpStatus: string
{
case OK = '200';
case CREATED = '201';
case BAD_REQUEST = '400';
case UNAUTHORIZED = '401';
case FORBIDDEN = '403';
case NOT_FOUND = '404';
case INTERNAL_SERVER_ERROR = '500';
}
在接口响应中规范使用
将枚举作为返回类型或参数类型,提升代码健壮性。配合现代框架(如 Laravel、Slim)或自定义响应工具,可统一处理状态码与对应消息。
- 函数参数强制接收枚举:避免传入非法字符串,如
function respond(HttpStatus $status) - 方法返回枚举实例:例如
public function getStatus(): HttpStatus { return HttpStatus::OK; } - 搭配 match 表达式映射 HTTP 消息:
$message = match($status) { HttpStatus::OK => 'OK', HttpStatus::NOT_FOUND => 'Resource not found', default => 'Unknown error' };
扩展枚举行为(添加描述/HTTP 状态文本)
PHP 枚举支持方法,可在枚举内封装业务逻辑。例如添加 message() 或 isClientError() 方法,避免散落各处的硬编码判断。
enum HttpStatus: string
{
case OK = '200';
case NOT_FOUND = '404';
case INTERNAL_SERVER_ERROR = '500';
public function message(): string
{
return match($this) {
self::OK => 'OK',
self::NOT_FOUND => 'Not Found',
self::INTERNAL_SERVER_ERROR => 'Internal Server Error',
};
}
public function isServerError(): bool
{
return str_starts_with($this->value, '5');
}
}
与 JSON/API 响应集成
默认情况下,(string) HttpStatus::OK 返回 '200',可直接用于 JSON 响应体或 header 设置:
-
http_response_code((int) HttpStatus::BAD_REQUEST);—— 转为 int 设置 HTTP 状态码 -
['code' => HttpStatus::UNAUTHORIZED->value, 'message' => HttpStatus::UNAUTHORIZED->message()]—— 组装结构化响应 - Laravel 中可配合
response()->json(...)->withStatus(...),传入(int) $enum
不复杂但容易忽略:记得在 IDE 中启用 PHP 8.1+ 语言级别支持,才能获得枚举的自动补全和类型检查;生产环境需确认 SAPI(如 Apache mod_php 或 PHP-FPM)已升级至 PHP 8.1 及以上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











