封装的本质是访问控制,而非仅将代码放入类中;php中需显式使用private或protected限制访问,并配套提供受控的public方法(如deposit、validateemail)才能实现真正封装,仅声明private而不提供合理接口则封装不完整。

不是。把代码写进类里只是封装的表象,不是封装的本质。
封装的核心是访问控制,不是“塞进类”
PHP 中的 class 本身不等于封装。你完全可以写一个全是 public 成员的类,它语法上合法、能运行,但几乎没封装可言——外部代码照样能随意读写属性、调用方法,和全局函数+全局变量没本质区别。
真正的封装发生在你主动使用 private 或 protected 限制访问,并配套提供受控入口时:
-
private $balance+public function deposit($amount):阻止直接赋值,强制走校验逻辑 -
protected function validateEmail($email):子类可用,但外部不可见,避免误用内部校验规则 - 不暴露
$db_connection这种敏感对象,只暴露saveUser()这样的业务方法
没有 set/get 方法的 private 属性,只是隐藏,不算完整封装
很多初学者以为只要加了 private 就算封装完成了,其实容易掉坑:
- 直接
private $name后不提供任何读写方式 → 外部完全无法使用这个属性,类变成“黑盒废件” - 只提供
getAge()但没做校验,仍可能返回负数或 null → 封装没起到数据保护作用 - 用
__get()/__set()魔术方法却没判断键名 → 实际上又把私有属性“全放开”了
真正有用的封装,往往搭配明确契约:setAge(int $age) 拒绝非整数、getAge(): int 保证返回整数、isAdult(): bool 抽象业务含义。
public 是默认值,不写修饰符 = 自动 public
这是最容易被忽略的细节,尤其对从其他语言转来的开发者:
-
function getName() { ... }→ 等价于public function getName() { ... } -
var $name;(PHP 4 风格)→ 已废弃,且隐式为 public,应改用public $name;或更严格的修饰符 - 子类继承时:
private方法/属性不会被继承;protected可被子类访问但不可被外部调用;只有public才是“完全开放”
换句话说,不显式写 private 或 protected,你就没在做封装,而是在放行。
封装最难的部分不是加关键字,而是判断哪些该藏、哪些该露、藏多深、露多少接口——这取决于业务边界和协作约定,而不是语法能不能通过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











