子类中调用父类方法的语法是parent::method(),必须显式调用以复用父类逻辑;若子类重写构造函数却未调用parent::__construct(),父类初始化将被跳过,导致配置、依赖或状态丢失。

子类中调用父类方法的语法是 parent::method()
PHP 中子类覆盖父类方法后,若需在子类方法里复用父类逻辑,必须显式用 parent:: 调用。这不是可选语法糖,而是强制要求——直接写 method() 会调用当前类(子类)自己的版本,哪怕它只是重写了空实现。
常见错误现象:子类重写了 save(),但在新逻辑里忘了调用父类保存逻辑,导致数据没入库、验证被跳过或事件未触发。
-
parent::只能在类方法内部使用,不能在静态上下文外用parent::$property直接访问非静态属性 - 参数传递完全由你控制,
parent::validate($data)和parent::validate($data, true)是两个不同调用 - 如果父类方法是
private,parent::无法访问——此时设计本身就有问题,应改用protected
构造函数里调用 parent::__construct() 是高频刚需
子类定义了 __construct() 却没手动调用父类构造函数,会导致父类初始化逻辑(如依赖注入、属性赋值、状态设置)全部丢失。PHP 不会自动帮你补上这句。
典型场景:Laravel 的 Controller 继承基类,或自定义 Model 类封装了连接初始化逻辑。
- 必须写
parent::__construct(...),且通常要传参,比如parent::__construct($config) - 调用位置不限于开头,但建议放在最前——除非你明确需要先做些前置判断再进父类初始化
- PHP7.3 不支持省略括号写法:
parent::__construct(无括号)是语法错误,必须带()
static:: 和 self:: 不能替代 parent::
有人试图用后期静态绑定绕过 parent::,比如写 static::validate() 或 self::validate(),这在多数情况下反而调用的是当前类的方法,不是父类的。
尤其当子类也定义了同名方法时,static:: 会指向子类自身,形成无限递归;self:: 则严格绑定声明处的类,跟继承链无关。
-
parent::是唯一能稳定指向“直接父类”对应方法的机制 - 若父类方法是
final,parent::仍可用,但子类无法覆盖该方法 - PHP7.3 对
parent::的解析是编译期确定的,不存在运行时歧义
调用父类静态方法也用 parent::
静态方法同样适用这套规则。子类重写父类静态方法后,想复用父逻辑,必须写 parent::buildUrl(),而不是 self::buildUrl() 或 static::buildUrl()。
容易踩的坑:把 parent:: 误写成 Parent::(首字母大写),PHP 会当作类名解析,报 Fatal error: Uncaught Error: Class 'Parent' not found。
- 大小写敏感:
parent::全小写,且必须紧挨冒号,不能有空格 - 静态调用不依赖实例,但
parent::依然有效,和是否static修饰无关 - 若父类静态方法用了
$this,在子类静态上下文中调用parent::会触发Fatal error: Using $this when not in object context
static:: 自动向上找,是 PHP7.3 项目里最常打断调试节奏的几个点。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











