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