首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PHPStorm中,当我有一个与每个子类返回不同类型的超类方法时,如何使类型暗示工作?

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

Stack Overflow用户
提问于 2014-10-20 16:22:09
回答 2查看 2.2K关注 0票数 9

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

代码语言:javascript
运行
复制
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()方法返回调用它的子类的实例,以便代码完成工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-20 19:47:56

找到它:

代码语言:javascript
运行
复制
class ActiveRecordClass {

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

考虑到关键字通常所做的事情,@return self@return static的工作方式似乎与您所期望的一样。@return self没有获取具体子类上可用的方法,但是@return static使自动完成工作非常出色。

票数 10
EN

Stack Overflow用户

发布于 2014-10-20 17:04:37

代码语言:javascript
运行
复制
/**
* @var ModelClass
**/ 
$model = ModelClass::find($model_id);

就像phpDoc中的- set变量类型一样

http://phpdoc.org/docs/latest/references/phpdoc/types.html还说,您可以使用“self”作为返回值的类型。

13 self,此类型适用的元素属于同一类,或其任何子元素,作为文档元素最初包含的子类。 例如: 方法C()包含在A类中。DocBlock声明其返回值为self类型。因此,方法C()返回A类的一个实例,这可能导致涉及继承时的混乱情况。 例如(以前的示例情况仍然适用): 类B扩展了A类,不重新定义方法C()。因此,可以从类B调用方法C()。在这种情况下,可能会出现歧义,因为可以将self解释为A类或B类。在这些情况下,self必须解释为包含self类型的DocBlock或其任何子类的类的实例。 在上面的例子中,self必须始终引用A类或B类,因为它是用A类中的方法C()定义的。 如果方法C()要在B类中重新定义,包括DocBlock中的类型定义,那么self将引用类B或它的任何子类。

所以试试

代码语言:javascript
运行
复制
/**
 * @return self
 */
public static function find() {
    // Code returns instance of called class
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26470325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档