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
相关产品推荐
相关产品推荐

