php 5.6 至 8.x 间系统常量未移除,破坏性变更集中于三方面:命名空间常量解析(5.6 起取消全局回退)、类常量可见性(7.1 新增 public/protected/private)、常量表达式能力(5.6→8.0 持续增强)。

PHP 5.6 到 PHP 8.x 期间,系统常量本身(如 PHP_VERSION、PHP_OS、__DIR__ 等)没有被移除或重定义,真正发生破坏性变更的是用户定义常量的作用域行为、可见性控制和解析规则。所谓“系统常量新旧对比”,实际聚焦在三类关键演进:命名空间常量解析逻辑、类常量可见性、以及常量表达式能力。这些变化直接影响老项目升级时的兼容性。
命名空间中未限定常量的查找行为(PHP 5.6 起断裂)
这是最典型的破坏性变更,极易引发运行时致命错误。
- PHP 5.5 及更早:引用
MY_CONST时,先查当前命名空间,找不到则自动回退到全局空间 - PHP 5.6+:只在当前命名空间查找;若未定义,直接抛出
Fatal error: Uncaught Error: Undefined constant - 后果:原本能跑的老代码,在 PHP 5.6+ 上因未加反斜杠前缀而崩溃
- 正确写法必须显式指向全局:
\MY_CONST,或在命名空间内重新定义该常量
类常量支持访问修饰符(PHP 7.1 起新增)
此前所有类常量默认 public,无法封装。PHP 7.1 开始允许用 public、protected、private 显式声明可见性。
-
private const TIMEOUT = 30;—— 仅本类可读,子类和外部均不可访问 -
protected const API_BASE = 'https://api.example.com';—— 子类可继承使用,外部不可见 - 继承时,子类不能降低父类常量可见性(如父类
public,子类不能重声明为private) - 静态反射(
ReflectionClass::getConstants())默认只返回 public 常量;需用getReflectionConstant()才能获取 protected/private
常量表达式能力持续增强(PHP 5.6 → 7.4 → 8.0)
从简单字面量,逐步支持编译期可求值的表达式,提升类型安全与性能。
- PHP 5.6:支持基础运算,如
const HALF_PI = M_PI / 2;(要求操作数均为字面量或已定义常量) - PHP 7.4:支持数组解构、null 合并(
??)、三元运算符等更复杂表达式 - PHP 8.0:引入
static关键字用于类内常量,表示“当前类上下文”(类似static::),但注意:不支持动态类名或变量作为常量名 - 限制始终存在:不能含函数调用、对象创建、
new、include、echo等运行时行为
命名空间常量导入语法(PHP 5.6 引入)
虽非破坏性,但改变了编码习惯,且易被忽略导致维护困难。
- 支持
use const MyProject\Settings\DEBUG_MODE;,之后可直接写DEBUG_MODE - 不支持通配符导入(
use const MyProject\Settings\*;是非法的) - 同名冲突时,导入的常量会覆盖当前作用域中同名的普通变量,但不会覆盖已定义的同名常量(后者报错)
- 建议:高频使用的配置常量优先导入;敏感值(如密钥)避免导入,改用完整限定名以增强可审计性
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











