parent::method()是php中调用父类被重写方法的唯一可靠方式,它指定作用域而非创建新实例,$this仍指向当前子类对象,属性访问保持子类状态。

PHP中用parent::method()调用被重写的父类方法
直接写parent::method()就行,这是唯一可靠方式。不能用$this->method(),哪怕父类和子类方法名一样,$this永远走当前类的实现。
为什么parent::不是“调用父类实例”,而是“指定作用域”
PHP里parent::不创建新对象,也不绕过当前对象状态,它只是告诉解释器:“请在这个方法里,把self临时指向父类定义的作用域”。所以父类方法里访问$this->property,读到的仍是子类实例的属性值。
- 常见错误:以为
parent::__construct()能“回滚”子类已改的属性 —— 实际上它只是执行父类初始化逻辑,不影响子类已赋值的属性 - 使用场景:子类
save()要先做校验(父类逻辑),再存日志(子类新增),就得在子类save()里显式调parent::save() - 注意:
parent::不能用于静态上下文调非静态方法,反之亦然;类型声明和返回类型必须兼容,否则报TypeError
调用带参数的父类方法时,参数传递要严格对齐
PHP不会自动补默认参数,也不会跳过必填参数。父类方法声明了function foo($a, $b = 'default'),子类调parent::foo('x')可以,但parent::foo()会报ArgumentCountError。
- 容易踩的坑:父类方法升级加了新参数(比如从
log($msg)变成log($msg, $level = 'info')),子类里旧的parent::log($msg)仍能跑,但漏传$level可能让日志级别错乱 - 性能影响:无额外开销,
parent::是编译期绑定,比反射快得多 - 兼容性:PHP 5.0+ 全支持,包括 trait 中的
parent::(只要该 trait 被类 use 且父类有对应方法)
父类方法被final修饰时,parent::依然有效但不可覆盖
final只阻止子类重写,不阻止子类调用。你可以在子类里安全写parent::finalMethod(),只要父类没把它设为private。
立即学习“PHP免费学习笔记(深入)”;
- 常见错误现象:
Call to private method Parent::xxx()—— 不是parent::失效,是父类方法本身是private,PHP 规定private连parent::都不可见 - 使用场景:框架基类把核心流程设为
final public function run(),子类只能调它,不能换实现,但可以包装前后逻辑 - 注意:
parent::不能跨继承链跳级,比如祖父类方法必须由直接父类暴露出来,子类不能parent::parent::method()
public/protected)和是否被private锁死,而不是它有没有被重写。很多人卡在private上,却去查重写语法,方向就偏了。











