php 7.1起类常量支持public/protected/private修饰符,未声明者仍默认public;需排查带修饰符的常量及其越权调用,按用途分级设可见性并辅以运行时检测。

PHP 7.1 升级后,类常量默认公开(public)的行为没有变,但关键变化在于——现在可以主动限制访问了。旧代码若未显式声明修饰符,仍按 public 处理;但一旦你开始用 protected 或 private 定义常量,就必须检查调用位置是否越界,否则会直接报致命错误。
确认类常量是否被加了可见性修饰符
搜索项目中所有 const 前带 public、protected、private 的定义。尤其注意配置类、状态类、工具类里的常量,比如:
-
private const SECRET_KEY = 'xxx';—— 类外部或子类调用会失败 -
protected const DEFAULT_TIMEOUT = 30;—— 子类可用,但控制器或服务层直接Class::DEFAULT_TIMEOUT就会报错 - 没加修饰符的
const VERSION = 'v2';—— 仍等同于public const,兼容性无影响
检查调用方是否越权访问
重点排查三类常见误用场景:
- 模板或视图里直接输出
Config::SECRET_KEY(本应是 private) - 单元测试中 mock 后尝试反射读取
protected常量 - 第三方 SDK 或插件通过字符串拼接方式动态访问常量,如
constant("Config::{$key}"),遇到非 public 常量会静默失败或抛出错误
验证运行时行为是否符合预期
在关键类中加一个简单检测方法,上线前快速兜底:
public static function checkConstantVisibility(): array {<br> return [<br> 'public_ok' => defined('self::ENV_PROD') ? 'yes' : 'no',<br> 'protected_fail' => @Config::SECRET_KEY === null ? 'blocked' : 'leaked',<br> ];<br>}
运行后看返回结果,能快速暴露哪些常量已被外部不当引用。
统一迁移建议
不建议一刀切改所有常量为 private,而应按用途分级处理:
- 对外暴露的标识、枚举值(如
STATUS_ACTIVE)保留public - 仅供子类扩展使用的阈值、开关(如
MAX_RETRY)设为protected - 密钥、内部算法参数、调试标记等一律改为
private,并通过 getter 方法提供受控访问
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











