在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
}
}