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

时间:2015-08-19 20:59:54

标签: php phpstorm jetbrains-ide

我有一个像这样的抽象类

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

和另一个继承它的类

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

1 个答案:

答案 0 :(得分:2)

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

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

这样它就会被解析为调用类。

<强> P.S。 类似地,@return $this可用于非静态方法。

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