我有一个从超类继承的类,其中该超类有一个静态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
}