PHP 8.2 中类常量(const)与枚举类(enum)严格区分:const 用于类内静态标量值,不具类型约束;enum 是独立类型,支持类型安全、match 穷尽检查及序列化。

PHP 8.2 中定义常量类需严格区分“类常量”与“枚举类”,二者语法、语义、序列化行为完全不同,混淆会导致运行时错误或类型不安全。
区分 const 和 enum:先搞清你要定义的是什么
类中用 const 定义的是静态值常量,属于类的命名空间,不可变但无类型约束;而 enum 是独立类型,每个 case 是该类型的唯一实例,具备完整对象语义和类型系统集成能力。
若你只是想存一个固定字符串如 'STATUS_ACTIVE',用 const STATUS_ACTIVE = 'active'; 即可;但若要表达“订单只能处于 pending/shipped/delivered 之一”,必须用 enum OrderStatus: string —— 后者在函数参数、match 分支、JSON 序列化中才真正受语言保护。
类常量(const)写法与限制
方法一:基础标量常量
在 class 内直接声明:const MAX_RETRY = 3; 或 const DEFAULT_FORMAT = 'json';。这类常量支持整数、字符串、布尔、null 及编译期可求值的简单表达式(如 1 + 2、array(1, 2))。
方法二:数组常量必须用 array(),不能用 []
【PHP 8.2 常量表达式禁止 []】:在 const CONFIG = []; 处会报 Syntax error, unexpected '['。必须改写为 const CONFIG = array(); 或 const CONFIG = array('host' => 'localhost');。这是编译期字面量规则决定的,不是 bug,是设计选择。
方法三:运行时定义用 define() 绕过限制
若需动态生成(如拼接字符串),不能放在 const 中,改用 define('MSG', implode(',', [1,2,3]));。注意:define() 定义的是全局常量,不归属任何类。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
枚举类(enum)定义与实战要点
第一步:选对 backing 类型
用 enum Status: string 表示 API/数据库字段映射,value 可直接 JSON 输出;用 enum Code: int 表示 HTTP 状态码,便于数值比较($code >= 400);纯 enum(无冒号)仅作状态标识,无 value 属性,无法直接序列化。
第二步:case 必须显式赋值(backed enum)
enum HttpStatus: int { case OK = 200; case NOT_FOUND = 404; } —— 缺少 = 200 会报错。纯 enum 则不允许赋值:enum Flag { case ENABLED; case DISABLED; }。
第三步:访问值用 ->value 或 ->name
HttpStatus::OK->value 得 200,HttpStatus::OK->name 得字符串 'OK'。别误写成 HttpStatus::OK::value(静态访问语法错误)。
第四步:match 表达式中必须穷尽所有 case
match($status) { OrderStatus::Pending => '等待处理', OrderStatus::Shipped => '已发货', }; —— 若漏掉 OrderStatus::Delivered,PHP 8.2 会抛出 UnhandledMatchError,这是类型安全的关键保障。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










