php 8.2 中类常量默认 public 是语义级隐式规则,自 php 5.0 起 const 即为 public 且不可省略修饰符(php 7.1+ 才支持显式声明);普通属性必须显式声明访问修饰符,无修饰符即语法错误,非默认 public。

PHP 8.2 中,类常量的默认访问属性是 public,而普通属性(即类的变量成员)若未显式声明访问修饰符,也默认为 public。表面看两者一致,但底层行为、使用约束和演化路径差异明显。
类常量的默认可见性与限制
自 PHP 5.0 起,const 定义的类常量就隐式具备 public 可见性,且**不允许省略修饰符也不允许显式写 public const(PHP 7.1 前语法错误)**。直到 PHP 7.1+ 才支持显式访问控制,此时才可写 public const、protected const 或 private const。
- 未加修饰符的
const NAME = ...在 PHP 7.1+ 仍等价于public const NAME = ... - 类常量一旦定义,值不可变,且不占实例内存——每个类只存一份,与对象数量无关
- 即使
private const,也只能在本类内部通过self::NAME访问,子类和外部均不可见
普通属性的默认可见性与演变
普通属性必须带访问修饰符(public、protected、private),PHP 7.4+ 还支持 readonly;不写修饰符会报语法错误(var 是过时写法,已废弃)。
- 没写修饰符 → 解析失败,不是“默认 public”,而是语法不合法
-
public $prop允许外部直接读写;protected $prop仅限本类及子类;private $prop仅限本类 - PHP 8.2 支持
readonly class,所有属性自动变为readonly,但常量不受此影响——常量天生只读
关键差异总结
虽然都“默认 public”,但本质不同:
- 类常量的
public是语义级默认:它代表“可被继承、可被外部通过::直接访问”,且不可运行时修改 - 属性的
public是语法级要求:必须显式写出,否则解析失败;它代表“可被任意代码读写”,值可变 - 常量支持 PHP 8.1+ 对象初始化(如
const LOGGER = new FileLogger(...)),属性虽也支持(PHP 8.1+ 构造函数参数默认值),但机制不同 - PHP 8.2 允许 trait 中定义常量,但 trait 不能声明属性——属性只能属于类
实际编码建议
明确意图比依赖默认更安全:
- 需要子类复用的常量,显式写
public const或protected const - 仅本类使用的配置值,优先用
private const,避免意外暴露 - 属性绝不要省略修饰符;敏感字段用
private+ getter/setter 控制;不变字段用readonly - 动态访问常量(如
Status::{$state})需 PHP 8.3+,PHP 8.2 不支持该语法
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











