php 7.1 是类常量可见性支持的分水岭版本:此前常量默认 public 且不可加修饰符;自 7.1 起正式支持 public/protected/private,影响语法合法性、运行时行为、继承逻辑与升级风险。

PHP 7.1 是类常量可见性支持的分水岭版本。在此之前,所有类常量默认 public 且无法加修饰符;从 7.1 开始,public、protected 和 private 才正式可用。版本适配不是“能不能用”的简单判断,而是涉及语法合法性、运行时行为、继承逻辑和升级风险的系统性问题。
PHP
在 PHP 7.0 及更早版本中:
- 类常量声明不支持任何访问修饰符,写
public const FOO = 1;会直接报语法错误(Parse error) - 所有常量天然可被外部代码通过
ClassName::FOO访问 - 子类可自由继承并重定义父类常量(PHP 8.1 起才引入
final const禁止重定义) - 没有
protected或private的概念,也就不存在“子类不可见”或“仅本类可用”的封装能力
PHP ≥ 7.1:三种修饰符全面生效,语义严格对齐属性/方法
自 7.1 起,修饰符行为与类属性、方法保持一致,但注意常量不可动态修改、不依赖实例:
- public const:仍为默认行为,显式声明推荐用于统一风格和未来兼容性
-
protected const:可在本类及所有子类中通过
self::或static::访问,但禁止类外部调用 -
private const:仅限定义它的那个类内部使用,子类无法继承、无法访问,哪怕用
parent::也不行
跨版本迁移必须检查的 3 类风险点
将旧项目升级到 PHP 7.1+ 时,以下情况极易引发致命错误或逻辑偏差:
-
旧代码误加修饰符:PHP 7.0 环境下若提前写入
protected const,部署即失败,需先清理或条件化编译(不推荐) -
子类意外访问父类 private 常量:7.1+ 中,子类里写
parent::PRIVATE_CONST会抛出 Fatal error —— 这在旧版因无 private 支持,实际从未存在过该调用 - 第三方库兼容性断裂:某些老库可能通过反射或字符串拼接方式读取常量名,若升级后将原 public 常量改为 protected/private,外部调用会静默失败或触发错误
安全适配建议:渐进式升级策略
不建议“一刀切”修改所有常量,而应按用途分级处理:
- 对外暴露的配置项(如
API_TIMEOUT、STATUS_ACTIVE)保留public,显式声明提升可读性 - 仅用于子类扩展的中间状态(如基类定义的
PENDING、RETRYING)设为protected - 纯实现细节(如加密盐值
SALT_PREFIX、内部错误码映射表)应改为private,杜绝外部误用 - 升级前用静态分析工具(如 PHPStan)扫描
const使用位置,确认无越界访问再调整可见性
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











