PHP 7.1+ 类常量必须显式声明 public/protected/private,不可省略;private 常量仅本类内可用(含 self::),子类不可继承或访问,须通过 public 静态 getter 暴露。

直接用 public、protected、private 修饰类常量即可控制访问范围
PHP 7.1+ 允许在 const 前加访问修饰符,这是唯一合法写法。不能像属性那样省略修饰符再靠默认行为兜底——没写修饰符会报语法错误。
-
public const TIMEOUT = 30;:外部可直接调用MyClass::TIMEOUT -
protected const API_VERSION = 'v2';:子类可用self::API_VERSION,但外部调用触发Fatal error: Cannot access protected constant -
private const SECRET_SALT = 'xyz';:仅本类内部可用,子类连parent::SECRET_SALT都不认,会报Fatal error: Cannot access private constant
self:: 和 static:: 访问私有常量时行为一致,但别误用 parent::
私有常量只属于定义它的那个类,不存在“继承”概念。哪怕子类里写 parent::PRIVATE_CONST,也会失败——它不是被屏蔽,而是根本不可见。
- 类内统一用
self::最安全,语义明确指向当前类声明的常量 -
static::在子类中可能触发 late static binding,但对private const无效,因为压根找不到符号 - 别试图用
parent::访问父类private const,PHP 不允许,也不提供反射绕过(ReflectionClass::getConstant()同样拿不到)
想对外暴露私有常量?必须通过 public 方法封装
直接访问 MyClass::PRIVATE_CONST 永远失败,没有例外。常见做法是加一层静态 getter:
class ApiConfig {
private const TIMEOUT = 30;
private const BASE_URL = 'https://api.example.com';
public static function getTimeout(): int {
return self::TIMEOUT;
}
public static function getBaseUrl(): string {
return self::BASE_URL;
}
}
- 调用
ApiConfig::getTimeout()✅,而ApiConfig::TIMEOUT❌ - 方法体里用
self::访问完全合法,不受可见性限制 - 别把 getter 设成
protected或private,否则外部还是拿不到
和全局 const、define() 的区别不能混淆
类常量的可见性是面向对象边界控制,和全局常量完全无关。三者互不干扰,也不存在“升级为 private”的转换路径。
立即学习“PHP免费学习笔记(深入)”;
-
const GLOBAL_FOO = 'bar';或define('GLOBAL_BAZ', 42);:一定义就全局可见,无法限制作用域 -
private const:只在类定义体内有效,连命名空间都出不去 - 别指望用
use导入类就能绕过private限制——可见性检查发生在解析期,不是运行时
Fatal error 中断执行,没有兜底机制。真正要隐藏的值,必须从声明那一刻起就用 private,而不是靠文档或约定。



















