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

PHP中如何在父类方法内克隆实例时正确返回子类实例

解决方案

你遇到的是IDE静态类型推断的问题,实际运行时clone $this在子类实例上调用时本来返回的就是子类实例,只要给父类方法加上正确的返回类型标识即可,有两种常用方案:


方案1:使用PHP 7.4+支持的原生static返回类型

直接在父类方法上声明返回类型为static,既可以满足运行时类型检查要求,也能让PhpStorm正确识别返回类型:

<?php
class myParentClass
{
    public function doAThing(): static
    {
        $clone = clone $this;
        // ... doing things
        return $clone;
    }
}

class myChildClass extends myParentClass {
    public function doTricks()
    {
        // ... do some tricks
    }
}

$myChild = new myChildClass();
$myChild = $myChild->doAThing(); // IDE会识别为myChildClass实例
$myChild->doTricks(); // 不再报错

方案2:使用PHPDoc标注(兼容低版本PHP)

如果你的项目使用的PHP版本低于7.4,不支持原生static返回类型,可以通过PHPDoc注释给IDE传递类型信息:

<?php
class myParentClass
{
    /**
     * 克隆当前实例并返回
     * @return static 调用方法的实际类实例
     */
    public function doAThing()
    {
        $clone = clone $this;
        // ... doing things
        return $clone;
    }
}

两种方案都可以让PhpStorm正确推断doAThing()在子类实例上调用时返回的是子类实例,消除类型错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:45:08