PHP 7.2起类属性必须显式声明public、protected或private,否则报语法错误;默认无修饰符仅对方法向后兼容(仍为public),但官方强烈建议显式声明以保障封装性与可维护性。

PHP 7.2 中,public、protected、private 是显式声明的访问控制修饰符,而默认访问属性(即不写任何修饰符)在 PHP 7.2 及之后版本已不再合法——它会直接导致语法错误。
PHP 7.2 起,类属性必须显式声明访问修饰符
从 PHP 7.2 开始,定义类属性时必须使用 public、protected 或 private 之一,否则报错:Parse error: syntax error, unexpected '...', expecting function (T_FUNCTION) or const (T_CONST)(具体错误信息取决于上下文)。
例如以下代码在 PHP 7.2+ 会失败:
class User {
$name = 'Alice'; // 缺少 public/protected/private → 解析错误
}
三种显式修饰符的实际权限范围
它们的访问规则在 PHP 7.2 中与后续版本一致,核心区别如下:
- public:可在类内部、子类中、类外部(通过对象或静态调用)任意访问
-
protected:可在类内部和所有子类中访问;但不能通过对象实例在类外部直接访问(如
$obj->prop会触发 Fatal Error) - private:仅限声明它的那个类内部访问;子类中不可见,外部更不可访问(即使同名属性在子类中定义,也与父类 private 成员完全隔离)
方法的默认行为仍为 public(但不推荐省略)
与属性不同,PHP 对方法仍保留“无修饰符即 public”的向后兼容规则。也就是说:
立即学习“PHP免费学习笔记(深入)”;
✅ 合法但不推荐:class Logger {
function log($msg) { echo $msg; } // 隐式 public,PHP 7.2 允许
}
不过,PHP 官方文档和 PSR-12 等编码规范强烈建议显式声明所有方法的可见性,以提升可读性与维护性。省略修饰符容易引发混淆,尤其在大型继承体系中。
为什么取消属性默认访问?
主要出于封装安全与代码明确性考虑:
- 避免开发者误以为“没写就是 public”,结果造成意外暴露内部状态
- 强制思考每个属性的设计意图:它该被谁访问?是否应提供 getter/setter?
- 统一风格,减少因隐式规则导致的协作歧义



















