敏感数据字段必须用 private,包括密码、密钥、令牌等安全关键字段,以及内部状态、缓存、校验型字段;private 是防止越权、误改、语义污染和保障校验逻辑唯一入口的第一道防线。

敏感数据字段必须用 private
密码、密钥、令牌、临时凭证等直接关系安全的字段,一旦暴露或被外部随意修改,会引发权限越界或数据泄露。PHP 不会自动阻止赋值,private 是第一道防线。
-
$pin、$apiToken、$encryptionKey这类值绝不应出现在public或protected中 - 即使配合类型声明(如
private string $apiToken;),也必须加private,否则类型只管“赋什么”,不管“谁来赋” - 子类也不应继承这些字段——
private能防止子类意外覆盖或误读,比如父类用$secretKey加密,子类若重定义同名属性就彻底失效
内部状态与计算中间值只能用 private
那些不参与对外契约、仅用于支撑本类逻辑的属性,比如缓存结果、连接句柄、状态标志位,设为 private 才能避免外部干扰和语义污染。
-
$dbConnection:数据库连接对象,外部不该也不需直接操作它 -
$isDirty:标记实体是否被修改过,供save()内部判断,暴露出去反而增加误用风险 -
$cache或$computedHash:这类值依赖其他属性推导而来,外部直接改会导致不一致,且子类通常也不该介入其生命周期
带校验/转换逻辑的字段优先用 private + setter
只要赋值需要验证、归一化、触发副作用(如日志、事件),就不能让外部绕过逻辑直接写属性。这类字段天然适合 private,再配一个带约束的 setXxx() 方法。
-
private int $age;配setAge(int $age): void检查 0–150 范围 -
private string $email;配setEmail(string $email): void做格式验证和小写归一化 - 注意:PHP 7.4+ 支持属性类型声明,但类型检查 ≠ 业务校验;
private是把校验逻辑收口到唯一入口的必要前提
别把 protected 当默认选项
很多开发者习惯把字段设成 protected,觉得“以后可能要继承”,结果导致子类过度耦合父类内部实现。真正需要子类访问的字段其实很少。
- 如果子类只需读取某个值,考虑用
protected的getXXX()方法,而不是开放protected属性本身 - 如果子类确实要修改某字段(如模板类中的渲染配置),先确认它是否属于“可变契约”——否则更稳妥的做法是抽象为策略接口,而非暴露字段
-
private不妨碍重构:未来真要开放给子类,改成protected是安全的;但反过来从protected收紧为private很可能破坏子类
private 是「类级别」而非「实例级别」,同一个类的不同实例可以互相访问对方的 private 属性。这在实现比较逻辑(如 isEqual(self $other))时很实用,但也会让人误以为它比实际更“私有”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











