【问题标题】:How to clone a child class instance within a parent class method如何在父类方法中克隆子类实例
【发布时间】:2021-12-22 12:57:58
【问题描述】:

我有一个儿童班。我的父类有一个实例方法,可以克隆$this 并流畅地返回克隆。我想将该实例方法与我的子类实例一起使用,但我在 IDE (PhpStorm) 中得到提示,返回值是父类的实例,而不是我所期望的子类的实例:

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

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

$myChild = new myChildClass();
$myChild = $myChild->doAThing(); // returns myParentClass instance, not myChildClass
$myChild->doTricks(); // Error, myParentClass doesn't have a doTricks() method

如何让myChildClass::doAThing() 传回myChildClass 实例?

【问题讨论】:

  • 你的php版本是什么,一切正常3v4l.org/HhjnA
  • 使用 v7.4。我的 IDE 只是抱怨我使用了错误的返回类型,所以它不会为我的子类实例提供提示。尝试了各种 PHPDoc 提示并声明 :self 返回类型,但无济于事。
  • 您使用的是哪个 IDE?请将此添加到您的问题中。
  • @greeflas PHPStorm。添加到问题

标签: php phpstorm clone extends


【解决方案1】:

您可以添加以下 PHPDoc 块,PhpStorm 将知道实际返回的对象

class myParentClass
{
    /**
     * @return static
     */
    public function doAThing()
    {
        $clone = clone $this;
        // ... doing things
        return $clone;
    }
}

【讨论】:

  • 而在php8中你可以public function doAThing(): static)
  • 天哪,一旦你看到它,它总是最明显的。留下这个问题,因为我在任何地方都找不到对此的任何引用。知道如何使用 PHPDoc 解决了很多问题。
  • @u_mulder 是的,谢谢你的提醒。慢慢将项目迁移到 php8。我的大部分仍然是
  • 这是一个很好的问题,但您的标题并不能反映您真正想知道的内容。一个更好的标题应该是:“调用父方法返回克隆的子类在 PHPStorm 中显示为父类实例。”更好的是包含您从 PHPStorm 获得的确切消息,因为将来人们会将消息剪切并粘贴到 Google 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2021-08-28
  • 1970-01-01
  • 2011-04-12
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多