PHP 7.0 中类属性若无访问修饰符则语法非法,所有合法声明必须显式使用 public/protected/private;所谓“默认 public”仅适用于 PHP 4 风格的旧写法,该写法在 PHP 7.0 已被移除。

PHP 7.0 中类属性的默认访问属性(即不显式声明 public/protected/private 时的行为)与其他 PHP 版本完全一致:始终是 public。
这个规则从 PHP 4 引入类语法起就固定下来,贯穿 PHP 5.x、7.x 全系列,直至 PHP 8.x —— 没有版本差异。
也就是说:
-
class A { $prop = 1; }
这里的$prop在 PHP 5.3、5.6、7.0、7.4、8.0、8.3 中,全部等价于public $prop = 1;
不会因版本升级而变成protected或触发警告/错误。
⚠️ 注意两个常见混淆点:
立即学习“PHP免费学习笔记(深入)”;
Trait 中定义属性后,类中同名属性的兼容性规则在 PHP 7.0 有调整
如知识库所述:PHP 7.0 之前,若 trait 定义了public $same,类再定义同名public $same,会触发E_STRICT;
PHP 7.0+ 则允许(只要可见性与默认值一致),不再报错或提醒。
→ 这是 trait 属性复用规则 的变化,不是类属性默认访问控制的变更。PHP 8.0+ 引入了属性类型声明语法(如
public string $name;),但未改变默认访问性
即使省略public,也不能写成string $name;—— 这会直接报语法错误。
所有属性声明仍必须显式写出访问修饰符(public/protected/private),否则解析失败。
总结关键事实:
- 类属性若无访问修饰符 → 语法非法(PHP 7.0 起已严格禁止)
- 所有合法类属性声明都必须带
public、protected或private - 若你看到没写修饰符却能运行,那它其实属于老式写法(PHP 4 风格),且仅在
public意义下被隐式接受 —— 但该写法自 PHP 7.0 起已被移除支持
所以答案很明确:
PHP 7.0 和其他主流版本对类属性的默认访问控制逻辑完全统一,不存在“不同版本表现不一致”的情况。



















