我有一个从超类继承的类,其中超类有一个静态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()方法返回调用它的子类的实例,以便代码完成工作?
发布于 2014-10-20 19:47:56
找到它:
class ActiveRecordClass {
/**
* @return static
*/
public static function find() {
// Code returns instance of called class
}
}考虑到关键字通常所做的事情,@return self与@return static的工作方式似乎与您所期望的一样。@return self没有获取具体子类上可用的方法,但是@return static使自动完成工作非常出色。
发布于 2014-10-20 17:04:37
/**
* @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或它的任何子类。
所以试试
/**
* @return self
*/
public static function find() {
// Code returns instance of called class
}https://stackoverflow.com/questions/26470325
复制相似问题