封装是控制“谁能访问”,继承是解决“谁来复用”;封装用访问修饰符限制直接读写,继承通过extends实现单继承与成员复用,二者目的、机制与作用层次截然不同。

封装是控制“谁能访问”,继承是解决“谁来复用”
封装不改变类的结构,只限制外部对属性和方法的直接读写;继承则让一个类获得另一个类的非私有成员,形成父子关系。两者目的完全不同:封装防乱改,继承省重复。
封装靠访问修饰符 + 方法控制,继承靠 extends 关键字
封装的核心动作是用 private、protected 把属性/方法“锁起来”,再通过 public 的 getXXX()/setXXX() 或魔术方法 __get()/__set() 提供可控入口。继承则必须显式写 class Child extends Parent,且 PHP 只支持单继承。
-
private成员子类完全看不到,连重写都不行 -
protected成员子类能直接用(比如$this->age),但外部对象不能调 - 子类里调父类构造函数必须用
parent::__construct(),否则父类初始化逻辑会丢失
常见混淆点:继承不是“复制”,封装不是“拒绝”
很多人以为 extends 后子类就“拥有”了父类所有代码——其实只是获得了访问权限;而 private 属性看似被“隔绝”,但通过 __get() 仍可间接暴露,这恰恰说明封装的重点是“控制权”,不是彻底封死。
- 父类
private $db不会被子类继承,子类里写$this->db直接报错Fatal error: Cannot access private property - 子类重写父类
public function save()是多态基础,但这个动作本身属于“重写”,和封装、继承都不同层 - 如果父类用
protected定义$config,子类可以直接改,但外部对象不能——这就是封装在继承链里的实际表现
最容易被忽略的细节:构造函数不自动传递,private 方法无法被继承调用
子类实例化时,父类的 __construct() 不会自动执行;而父类标记为 private 的方法,哪怕子类写了同名方法,也完全不是重写——因为子类根本看不见它,二者是两个独立方法。
- 忘记调
parent::__construct()→ 父类初始化逻辑失效,比如数据库连接没建立 - 误以为
private function init()能被子类覆盖 → 实际上子类的同名方法只是新定义,和父类无关 - 把
protected当成“半公开” → 其实它和public一样可能被子类意外修改,需谨慎设计
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











