You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP继承中$this关键字作用机制疑惑及无限递归问题求解

PHP继承中$this的指向与无限递归问题

核心概念:$this的本质

在PHP中,$this始终指向当前运行时的对象实例,而非定义该方法的类。无论方法是在父类还是子类中定义,只要通过某个对象实例调用,$this就指向那个具体的实例——这是PHP动态方法绑定(晚绑定)的特性。

你的代码递归流程分析

一步步拆解执行逻辑:

  1. 创建Strawberry实例$strawberry,调用$strawberry->display()
  2. 执行子类Strawberry::display(),其中调用parent::intro()(即父类Fruit::intro())
  3. 在Fruit::intro()中执行$this->display()——此时$this指向的是Strawberry实例,因此会调用子类的Strawberry::display()而非父类的Fruit::display()
  4. 流程回到步骤2,形成无限递归,最终会因内存耗尽抛出错误

如何解决:强制调用父类方法

如果你希望在父类intro()中固定调用自己的display()方法,不要使用$this,而是用self::display()或者直接通过类名调用Fruit::display():

修改后的父类代码:

class Fruit {
  public function intro() {
    echo "In Fruit-intro"; 
    self::display(); // 或 Fruit::display()
  }
  public function display() {
      echo "Fruit-display"; 
  }
}

补充:self::与$this->的区别

  • self:::静态绑定,指向定义该代码的类,无论运行时对象是什么类型,都调用当前类的方法
  • $this->:动态绑定,指向当前运行的对象实例,会根据对象的实际类型调用对应类的方法

内容的提问来源于stack exchange,提问作者Arpit Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:09:27