PHP 8.0+要求类常量必须显式声明public/protected/private,否则报ParseError;public可在任意位置访问,protected仅限本类及子类内部,private仅本类可访问且不可继承。

PHP 8.0+ 类常量可见性不再是“默认 public”
从 PHP 7.1 开始,类常量就支持显式声明 public、protected 和 private;但直到 PHP 8.0+,不写修饰符会触发严格解析错误——代码直接无法运行。这意味着:class Config { const APP_NAME = 'MyApp'; } 在 PHP 8.0+ 中会报 ParseError,必须补全可见性关键字。
三种可见性在继承与调用中的实际行为
类常量的访问规则和属性/方法一致,但需注意它不参与动态查找或魔术方法拦截:
-
public const:可在类内、子类、外部任意位置通过
ClassName::CONST_NAME或$obj::CONST_NAME访问 -
protected const:仅限本类及子类内部使用(如
self::SECRET_KEY或static::SECRET_KEY),外部调用会报Fatal error -
private const:只能在定义它的那个类中访问;子类即使同名也无法继承或重写,
parent::或static::均不可用
升级时容易踩坑的典型场景
迁移旧项目到 PHP 8.0+ 时,以下写法必须修改:
- 所有未加修饰符的
const声明,统一补上public(若原意是公开)或按封装需求选protected/private - 子类中试图访问父类
private const—— 这在 PHP 7.1+ 已不合法,不是兼容性警告,而是硬性拒绝 - 用
ReflectionClass::getConstants()获取常量时,private和protected不再出现在返回结果中(反射也受可见性约束) - 框架配置类中曾用
public static $var模拟常量?现在应改用public const,更语义清晰且不可变
推荐的现代写法与设计建议
结合 PHP 8.x 的演进趋势,建议这样组织常量:
- 对外暴露的配置项(如 API 版本、环境标识)用
public const - 仅供子类定制逻辑的钩子值(如默认超时、重试次数)用
protected const - 纯内部使用的密钥、路径前缀、状态码映射等,用
private const封装,避免意外泄露 - 避免在构造函数或方法中重复定义“伪常量”,优先提取为类常量并赋予恰当可见性
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











