php 8.3+ 支持直接用 classname::{$variable} 动态访问类常量,取代 constant(),具备作用域校验、类型推断和权限控制;同样适用于枚举成员访问。

PHP 8.3+ 不再需要内置函数来动态访问类常量——直接用 ClassName::{$variable} 语法即可,彻底替代了过去必须调用 constant() 的方式。这是语言级支持,不是函数,也不依赖扩展。
动态访问类常量(推荐写法)
只要变量值是合法的常量名字符串,就能直接拼接访问:
class Status { const PENDING = 'pending'; const PAID = 'paid'; }$key = 'PAID'; echo Status::{$key}; // 输出 'paid'- 支持表达式:
$suffix = 'ED'; echo Status::{'SHIPP' . $suffix}; // 输出 'shipped' - 变量内容必须是字符串,否则抛出
TypeError;空字符串、数字、数组等都不行
对比:PHP 8.3 之前的兼容写法
如果你要兼顾旧版本或做运行时兜底,仍可保留 constant(),但注意它不校验作用域和可见性:
echo constant('Status::PAID'); // ✅ 有效,但无访问控制echo constant('Status::PRIVATE_CONST'); // ❌ 即使是 private 常量也能读取,有安全隐患-
Status::{$key}会遵守public/protected/private权限规则,更安全
配合类型化类常量使用
PHP 8.3 支持为类常量声明类型,动态访问时类型检查依然生效:
class Api { public const string ENDPOINT = 'https://api.example.com'; }$name = 'ENDPOINT'; $url = Api::{$name}; // $url 被推断为 string 类型- 如果尝试
Api::{$badName}且$badName不是定义过的常量名,运行时报Error(非 TypeError)
枚举中同样适用
动态获取枚举成员也支持该语法,适用于状态机、配置映射等场景:
enum OrderStatus: string { case Pending = 'pending'; case Shipped = 'shipped'; }$statusName = 'Shipped'; $val = OrderStatus::{$statusName}; // 返回 OrderStatus::Shipped 实例- 注意:这里返回的是枚举对象,不是字符串值;如需字符串值,用
OrderStatus::{$statusName}->value
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











