子类可访问父类public和protected常量,不可访问private常量:public用self::或parent::均可,推荐self::;protected仅类内及子类可用self::读取;private子类完全不可见,应通过getter间接访问。

子类可以直接访问父类的 public 和 protected 类常量,但不能访问 private 常量。这不是“技巧”,而是 PHP 7.1+ 的明确语义规则——关键在于理解可见性边界,而非绕过限制。
public 常量:子类可自由引用,无需特殊写法
public 常量对外完全开放,子类中用 self::CONST_NAME 或 parent::CONST_NAME 都能正确访问,效果一致:
- 推荐用
self::—— 更清晰表达“当前类作用域下访问继承来的常量” -
parent::也可用,但仅在需明确强调“来自父类”时才有语义价值 - 外部代码(如
MyChild::PUBLIC_CONST)同样可直接调用,无限制
protected 常量:只能在类内部或子类中读取,不可导出
protected 常量的设计本意是“供继承体系内部使用”,子类可以安全读取,但外界无法触达:
- 子类中写
self::PROTECTED_CONST✅ 正确且推荐 - 子类中写
parent::PROTECTED_CONST✅ 语法合法,但无必要 - 类外部写
MyChild::PROTECTED_CONST❌ 致命错误:Cannot access protected constant - 注意:即使子类重写了同名 public 常量,也不会覆盖父类的 protected 常量——它们共存且互不干扰
private 常量:子类完全不可见,也不应尝试访问
private 常量严格绑定于定义它的类,子类连声明都看不到:
-
self::PRIVATE_CONST在子类中会报错:Undefined class constant -
parent::PRIVATE_CONST同样报错:Cannot access private constant - 若子类确实需要类似值,应由父类提供受保护的 getter 方法,而不是暴露 private 常量
- 强行反射或调试器读取属于破坏封装,不适用于生产逻辑
实战建议:按意图选择常量可见性
别把 protected 当作“半公开”的妥协方案,而要服务于设计契约:
- 配置开关、环境标识等子类可能依赖但不应被外部修改的值 → 用 protected const
- 对外暴露的协议版本、错误码枚举等稳定接口 → 用 public const
- 纯内部实现细节,比如哈希盐值、默认超时毫秒数 → 用 private const,并通过 protected 方法间接控制行为
- 避免在子类中硬编码父类常量值——它破坏了可维护性;始终通过
self::引用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











