如何用抽象工厂方法告诉 PhpStorm 变量类型?

How to tell PhpStorm type of variable with abstract factory method?

我有一个像这样的摘要class

abstract class AbstractClass
{
    /** 
     * @return AbstractClass
     */ 
    public static function forge($data)
    {
        return new static($data);
    }
}

和另一个继承它的 class

class OtherClass extends AbstractClass
{
    public function my_method()
    {
        echo 'hello';
    }
}

当我打电话时

$otherClass = OtherClass::forge($otherclass_data);

PhpStorm 不会自动完成 my_method(),实际上会弹出一个错误:

Method 'my_method' not found in class 'AbstractClass'

有什么方法可以强制 PhpStorm 知道我伪造了 OtherClass,而不是 AbstractClass

在这种情况下使用@return static,例如

abstract class AbstractClass
{
    /** 
     * @return static
     */ 
    public static function forge($data)
    {
        return new static($data);
    }
}

这样它将被解析为调用class。

P.S. 同样 @return $this 可用于非静态方法。

P.P.S. 请注意,在一些不太简单的情况下(例如,在另一个 class 的另一种方法中使用具有这种 @return (静态或 $this)的方法 class 也使用这种方法)可能会导致 IDE 混淆,从而产生错误警告——这是一个 IDE 问题,希望在未来的某个版本中得到解决。