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

PHP中子类实例如何调用父类Foo的func()方法?

在PHP中调用被子类重写的父类方法

当然可以啦!PHP提供了几种直观的方式来实现类似你说的C++里强制调用父类重写方法的需求,我结合你的示例代码给你一步步讲清楚。

先回顾下你的基础场景

你给出的PHP代码是这样的:

class Foo {
    protected static $a = 1;
    protected $b = 2;
    public function func() {
        return 'foo' . static::$a . $this->b;
    }
}

class Bar extends Foo {
    protected static $a = 3;
    protected $b = 4;
    public function func() {
        return 'bar' . static::$a . $this->b;
    }
}

$obj = new Bar();
echo $obj->func(); // 输出 'bar34'

你提到C++里能通过强制类型转换调用父类的func()得到'foo14',PHP里不用这么绕,有更直接的语法。


方法1:子类内部直接调用父类方法

如果是在Bar类的方法里想调用Foo的func(),直接用parent::关键字就行,这是PHP里调用父类重写方法的标准写法:

class Bar extends Foo {
    protected static $a = 3;
    protected $b = 4;
    public function func() {
        return 'bar' . static::$a . $this->b;
    }

    // 新增一个方法调用父类的func
    public function callParentFunc() {
        return parent::func();
    }
}

$obj = new Bar();
echo $obj->callParentFunc(); // 这里输出 'foo34'

这里要注意:static::$a是PHP的后期静态绑定特性,它会指向当前运行的类(也就是Bar),所以用的是子类的$a=3;而$this->b是实例属性,当前实例是Bar,所以用的是$b=4。如果想得到和你C++示例一样的'foo14',只要把父类里的static::$a改成self::$a就行——self会严格指向定义该方法的类(也就是Foo),这样就会用父类的$a=1了。


方法2:外部直接调用父类方法(不用修改子类)

如果不想改动Bar类,在外部直接调用Foo的func()方法,也有两种靠谱的方式:

方式A:用类名直接调用并传入实例

PHP 7.0+支持在调用非静态方法时,通过静态调用的方式传入$this参数:

$obj = new Bar();
echo Foo::func($obj); // 输出 'foo34'(同样,改父类的static为self就能得到foo14)

方式B:用闭包绑定上下文

更规范的方式是用闭包绑定实例和类作用域,这样能确保调用的是父类的方法:

$obj = new Bar();
// 定义一个匿名函数,内部调用父类的func
$parentFunc = function() {
    return parent::func();
};
// 把这个闭包绑定到Bar实例,并且指定作用域为Foo类
$boundFunc = $parentFunc->bindTo($obj, Foo::class);
echo $boundFunc(); // 输出 'foo34'

或者用call_user_func直接指定父类方法:

echo call_user_func([$obj, 'Foo::func']); // 同样输出 'foo34'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:28:09