Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHPStorm中,当我有一个从每个子类返回不同类型的超类方法时,如何使类型暗示工作_Php_Phpstorm - Fatal编程技术网

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

在PHPStorm中,当我有一个从每个子类返回不同类型的超类方法时,如何使类型暗示工作,php,phpstorm,Php,Phpstorm,我有一个从超类继承的类,其中超类有一个静态的find()方法,该方法实例化子类的实例(活动记录模式) 目前,docblock在代码完成和类型提示方面并不太好。我不能使用超类作为返回类型,因为由于DB列的原因,子类有不同的方法 如何向PHPStorm指示超类find()方法返回调用它的子类的实例,以便代码完成工作 /** * @var ModelClass **/ $model = ModelClass::find($model_id); 与此类似-使用phpDoc设置变量类型 也 假设您可以

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

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

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

/**
* @var ModelClass
**/ 
$model = ModelClass::find($model_id);
与此类似-使用phpDoc设置变量类型

也 假设您可以使用“self”作为返回值的类型

13 self,该类型适用的元素属于同一类,或 它的任何子元素,文档化元素最初与之相同 包含

例如:

方法C()包含在类A中。DocBlock声明其 返回值的类型为self。因此,方法C()返回一个实例 这可能会导致继承失败时出现混乱的情况 牵涉其中

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

类B扩展了类A,并且没有重新定义方法C()。就其本身而言 可以从类B调用方法C() 由于self可能被解释为A类或 B.在这些情况下,必须将自身解释为 类,其中写入包含自类型的DocBlock或 它的儿童班

在上述示例中,self必须始终指A类或B类,因为 使用类A中的方法C()定义

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

所以试试看

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

class ActiveRecordClass {

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

似乎
@return self
@return static
的工作方式与给定关键字的正常工作方式相同
@return self
没有选择具体子类上可用的方法,但是
@return static
使自动完成工作得很好。

ModelClass
中使用
@method
重新声明父类的
find()
方法以及所需的签名。谢谢。听起来很完美,但似乎不适用于@return self。最重要的建议是我到目前为止一直在做的事情,但这有点费劲,我希望只定义返回类型:(看起来phpDoc不支持后期静态绑定。(在我的例子中,它将结果作为ActiveRecordClass进行处理)。因此,您可以使用另一个功能/***@var B$B*/$B=B::find();你能显示文档的链接吗?我在@VasilVanchuk--#14的最底部没有找到“static”。@return$这是否有效?如果我没记错的话,我一直在phpstorm 7中使用@return static关键字,但它在php storm 2016中不再提供自动正确完成功能。1分离但相关的问题:这适用于父类,但它会不为工厂工作,对吗?静态允许孩子们…你必须显式地编写
@return ClassA | ClassB | ClassC
,对吗?
class ActiveRecordClass {

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