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

时间:2014-10-20 16:22:09

标签: php phpstorm

我有一个继承自超类的类,其中超类具有静态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()方法返回它所调用的子类的实例,以便代码完成有效?

2 个答案:

答案 0 :(得分:8)

找到它:

class ActiveRecordClass {

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

似乎@return self vs @return static的工作方式与关键字通常所做的相同。 @return self没有选择具体子类上的可用方法,但@return static使自动完成工作变得很棒。

答案 1 :(得分:0)

/**
* @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()返回一个实例   A类。这可能会导致继承时出现混乱的情况   参与。

     

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

     

B类扩展了A类,并没有重新定义方法C()。就这样吧   可以从B类调用方法C()。在这种情况下   由于自我可以被解释为A类或A类,因此可能会出现歧义   B.在这些情况下,自我必须被解释为一个实例   包含自我类型的DocBlock的类或任何类   它的儿童班。

     

在上面的例子中,自我必须始终引用A类或B类   在A类中用方法C()定义。

     

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

所以试试

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