PHP 7.1 新增类常量可见性控制,支持 public、protected、private 修饰符;接口常量自 PHP 5.0 起仅隐式 public,至今不支持任何访问修饰符,因其属契约范畴,须对外公开且无内部作用域。

PHP 7.1 并没有给接口(interface)新增常量支持——接口中声明常量的能力早在 PHP 5.0 就已存在,且一直只支持 public 常量,PHP 7.1 并未改变这一点。
你可能混淆了两个不同但相关的特性:
- ✅ PHP 7.1 确实新增了「类(class)常量的可见性控制」:即允许在
class中使用public、protected、private修饰常量; - ❌ 但接口(
interface)中的常量始终是public且不可加访问修饰符,PHP 7.1 未对此做任何变更,至今(2026年)仍不支持protected或private接口常量。
接口常量的真实情况(PHP 5.0 – PHP 8.3)
- 接口可以定义常量,语法为:
interface CacheStrategy { const TTL = 3600; const PREFIX = 'cache:'; } - 这些常量隐式为
public,且不允许显式写public const(会报语法错误),更不支持protected/private; - 所有接口常量自动继承为
public,实现类或使用方可通过InterfaceName::TTL直接访问; - 这是语言规范决定的:接口描述的是“契约”而非“实现”,其常量属于公开协议的一部分,天然需对外暴露。
为什么接口不能有 private/protected 常量?
- 接口不包含运行时逻辑,也不实例化,没有“内部作用域”的概念;
-
private意味着仅本类可访问——但接口不是类,没有“本类内部”; -
protected意味着子接口或实现类可访问——但 PHP 不支持接口继承常量(extends接口只继承方法签名),且实现类无法“继承”接口常量的访问权限; - 因此,为接口常量添加非
public修饰符既无语义基础,也无执行上下文支撑。
对比:类 vs 接口 的常量能力
| 特性 | 类(class) |
接口(interface) |
|---|---|---|
支持 const
|
✅(PHP 5.0+) | ✅(PHP 5.0+) |
可用 public 修饰 |
✅(PHP 7.1+,显式可选) | ❌(语法错误,禁止写 public const) |
可用 protected/private
|
✅(PHP 7.1+ 新增) | ❌(永远不支持) |
| 常量是否可被外部直接访问 | 取决于修饰符 | ✅ 总是可(隐式 public) |
是否支持后期静态绑定(如 static::CONST) |
✅(PHP 5.3+,但 self:: 和 static:: 行为有差异) |
✅(但仅限 InterfaceName::CONST,不支持 static:: 引用接口常量) |
实际建议
- 如果你需要封装常量(比如敏感配置、内部状态码),请定义在
class中,并用private或protected修饰; - 如果你需要定义跨模块共享、约定性、契约型常量(如 HTTP 状态码、消息类型、缓存策略标识),放在
interface中是合适的——它们本就该是公开、稳定、不可隐藏的; - 不要试图在接口里写
private const XXX = ...,这会导致 Parse Error; - 升级到 PHP 7.1+ 后,优先把原属于
class的“内部魔法值”迁移到private const,而不是去改造接口。
该特性边界清晰:PHP 7.1 赋予的是类的封装能力,而非扩展接口的语义权力。



















