PHP 7.4 中不建议依赖默认访问属性,因其等价于 public,破坏封装性,无法校验业务规则、追踪修改、统一格式化,且增加重构与协作成本;应显式声明 private/protected/public 并配类型及受控访问。

PHP 7.4 中不建议依赖默认访问属性(即省略 public、protected 或 private),根本原因在于:**它等价于 public,会彻底破坏封装性,且隐式行为易被忽略,带来安全隐患和维护风险。**
默认属性实际就是 public,毫无访问控制
在 PHP 中,如果声明属性时不写任何访问修饰符,例如:
class User {$name;
$email;
}
这等同于:
public $name;
public $email;
}
外部代码可随意读写这些属性,无法插入验证、日志、触发事件或做任何逻辑干预。
立即学习“PHP免费学习笔记(深入)”;
类型声明无法弥补可见性缺失
即使你为默认属性加上类型(如 $age = 0; 并配合严格模式),PHP 7.4 的类型检查只在赋值时生效,但:
– 无法阻止非法值绕过 setter 直接写入;
– 无法校验业务规则(比如“年龄必须 ≥ 0 且 ≤ 150”);
– 无法统一处理格式化(如邮箱自动 trim 或小写);
– 无法追踪谁、何时、为何修改了该值。
重构与协作成本显著升高
- IDE 无法识别意图:没有显式修饰符,工具无法区分哪些属性本应受控、哪些真需开放;
- 子类继承失控:
public属性被子类自由覆盖或误用,破坏父类契约; - API 边界模糊:外部调用者误以为所有属性都可直接操作,导致耦合加深;
- 后续加封装需大规模修改:一旦想把
$status改成私有并加校验,所有已有直访问代码全报错,且难以定位。
正确做法:显式声明 + 类型 + 受控访问
- 内部状态一律用
private(如private string $email;); - 需要子类扩展的用
protected(如protected int $retryCount;); - 真正需外部自由读写的极少数字段才用
public,且必须配类型(如public readonly int $id;,PHP 8.1+ 更佳); - 配套提供 getter/setter,并在 setter 中嵌入校验、转换、通知等逻辑。



















