parent 是 php 中用于在子类中显式调用父类成员的伪类,仅限类内部使用,可访问 public/protected 成员,不支持 private 或跨级调用,不可替代为 self。

parent 在 PHP 类继承中怎么调用父类方法
它不是关键字,是伪类(pseudo-class),专用于在子类里明确指向父类的成员。最常见用途就是重写父类方法时,想保留父类原有逻辑再追加操作。
比如子类覆盖了 __construct(),但又需要执行父类初始化:必须用 parent::__construct() 显式调用,否则父类构造函数不会自动执行。
- 只在类内部可用,不能在函数或全局作用域中使用
- 只能访问被子类继承且可访问的成员(
public或protected;private不行) - 不支持链式调用父类的父类(即
parent::parent::method()语法非法)
为什么不能直接用 self 替代 parent
self 指向当前类,parent 指向直接父类——这是本质区别。若子类没重写某个方法,self::method() 和 parent::method() 可能效果一样;但一旦重写了,self 就会调用子类版本,陷入无限递归或逻辑错乱。
典型翻车现场:self::__construct() 在已重写的构造函数里会导致死循环;而 parent::__construct() 才是安全跳转到父级初始化的唯一方式。
立即学习“PHP免费学习笔记(深入)”;
商品查询功能提供了一个快速查看商品的途径。商品查询分为基本查询和高级查询。基本查询:提供关键字和商品大类两种条件的查询,用户可以只填写关键字或者选择商品大类或者关键字和商品大类都填写来查询商品。高级查询:提供关键字,商品大类,商品小类,商品价格范围四种条件的查询,用户可以任意填写其中一种或几种的查询条件来查询想要了解的商品信息。商品查询功能大大的方便了用户,提高了网站的用户体验。(5)帮助系统模块
- 静态上下文下尤其危险:
self遵循“晚期静态绑定”的类名,parent始终锁定父类定义 - IDE 和 PHPStan 等工具通常无法识别
self在重写场景下的歧义,但parent含义始终明确
parent::static 属性或常量是否可行
可以,但仅限于 public 或 protected 的静态属性和类常量。注意:PHP 不允许用 parent::$prop 修改父类静态属性(除非该属性本身是 public 且未被子类同名遮蔽)。
常见误用:parent::MY_CONST 正确;parent::$config 只有在父类声明为 public static $config 且子类未定义同名属性时才有效。
- 类常量不支持访问控制修饰符,所以
parent::CONST_NAME总是可用 - 静态属性若被子类重新声明(哪怕只是
public static $config),则parent::$config会指向父类原始值,而非子类副本 - PHP 8.1+ 对
parent::访问private静态成员会报Cannot access private property
parent 调用失败时的典型错误信息
最常遇到的是 Fatal error: Uncaught Error: Cannot access parent:: when current class scope has no parent —— 说明当前类根本没继承任何类,却写了 parent::xxx。
另一个高频报错:Call to undefined method parent::xxx(),意味着父类压根没有这个方法,或者拼写错误(比如大小写不符,而 PHP 类方法名区分大小写)。
- 接口不能用
parent,因为接口之间是extends关系,但实现类对接口的方法是“实现”而非“继承” - trait 中不能直接用
parent,除非该 trait 被类 use 后,在类方法内通过parent::调用(trait 本身无父类概念) - 匿名类无法使用
parent,因为其父类在定义时未显式声明(即使 extends 了某类,语法上也不支持在匿名类体内写parent::)








