PHP 8.3 支持类常量显式类型声明(如 public const string NAME = 'foo';),而 PHP 8.2 不支持,会报语法错误;该特性仅用于编译期校验与静态分析,不改变运行时性能或 opcache 行为。

Typed Constants 在 PHP 8.2 中并不存在——这是个常见误解。PHP 8.2 没有引入类常量类型声明,真正支持类常量类型的是 PHP 8.3(通过 RFC “Typed Class Constants”),而它在 8.2 中完全不可用。
你可能混淆了以下两个独立特性:
- PHP 8.2 的
readonly class和readonly属性 - PHP 8.3 新增的
public const string NAME = 'foo';这类带明确类型的常量声明
所以如果你在 8.2 环境下写了带类型的常量,比如:
class Config {
public const int VERSION = 1;
}PHP 8.2 会直接报错:ParseError: Syntax error, unexpected 'int' (T_STRING), expecting identifier or '{'
立即学习“PHP免费学习笔记(深入)”;
PHP 8.3 的 typed constants 会影响性能吗?
不会带来可观测的运行时性能提升。原因如下:
- 常量类型仅用于编译期校验和静态分析(如 PHPStan、Psalm),不参与 Zend 引擎执行流程
- 常量值本身仍以普通 zval 存储,类型信息不嵌入运行时结构
- 没有 JIT 优化路径针对“带类型的常量”做特殊处理
- opcache 缓存行为与 8.2 完全一致:常量值被内联,类型注解被丢弃
你可以验证这一点:用 opcache_get_status()['scripts'] 查看同一段代码在 8.3(带类型)和 8.2(去掉类型后)的 opcache 编译结果,OPCode 完全相同。
那为什么还要用 typed constants?
- 让 IDE 补全更准,比如
Config::VERSION->能推导出方法链 - 防止误赋值:静态分析器能捕获
Config::VERSION = 'abc'这类错误(虽然运行时本就不会允许改 const) - 为 future strict mode(比如构想中的
strict_types=3)铺路,但目前无 runtime effect
升级到 8.3 后要注意的坑
- Composer 依赖需显式声明
"php": "^8.3",否则某些包可能跳过兼容检查 - 如果项目用了
phpstan/phpstan,建议升级到 1.10+,旧版对 typed constants 支持不完整 -
ReflectionClass::getConstants()返回值不变,类型信息无法通过反射获取(设计如此,非 bug)
类型声明这件事,本质是往开发体验和工程约束上加砝码,不是给 Zend VM 做加速。真要抠性能,该盯的是 opcache.jit 策略、对象复用、或避免在循环里反复调用 is_array() 这类函数。



















