在PHPStorm中,当我有一个从每个子类返回不同类型的超类方法时,我如何使类型提示工作


In PHPStorm, how can I make type hinting work when I have a superclass method that returns a different type from each subclass

我有一个从超类继承的类,其中该超类有一个静态find()方法,该方法实例化子类的实例(活动记录模式)。

class ActiveRecordClass {
    /**
     * @return mixed
     */
    public static function find() {
        // Code returns instance of called class
    }
}
class ModelClass extends ActiveRecordClass {
}
// returns instance of ModelClass, but PHPStorm doesn't realise
ModelClass::find($model_id); 

目前,docblock对于代码完成和类型提示来说并不是很好。我不能使用超类作为返回类型,因为由于DB列的原因,子类有不同的方法。

我如何向PHPStorm指示超类find()方法返回从中调用的子类的实例,以便代码完成工作?

找到它:

class ActiveRecordClass {
    /**
     * @return static
     */
    public static function find() {
        // Code returns instance of called class
    }
}

考虑到关键字的正常作用,@return self@return static的工作方式似乎与您预期的相同。@return self没有选择具体子类上可用的方法,但@return static使自动完成非常有效。

/**
* @var ModelClass
**/ 
$model = ModelClass::find($model_id);

类似于使用phpDoc 设置变量类型

此外http://phpdoc.org/docs/latest/references/phpdoc/types.html说你可以使用"self"作为返回值的类型

13 self,该类型适用的元素属于同一类,或它的任何子项,作为文档元素的原始项包含。

例如:

方法C()包含在类A中。DocBlock声明其返回值的类型为self。因此,方法C()返回一个实例当继承为卷入的

例如(前面的示例情况仍然适用):

类B扩展了类A,并且不重新定义方法C()。因此可以从类B调用方法C()。在这种情况下由于self可能被解释为A类或B.在这些情况下,self必须被解释为类,其中编写了包含self-type的DocBlock或它的子类。

在上面的例子中,self-MUST总是指A类或B类,因为它是用A类中的方法C()定义的。

如果方法C()要在类B中重新定义,包括类型在DocBlock中定义,则self将引用类B或任何它的孩子。

所以试试

/**
 * @return self
 */
public static function find() {
    // Code returns instance of called class
}