考虑以下代码:
class ParentClass {
public static function generate($className = __CLASS__){
if(!$className) return new self();
else return new $className();
}
}
class ChildClass extends ParentClass {
/**
* @param string $className
* @return ChildClass
*/
public static function generate($className = __CLASS__) {
return parent::generate($className);
}
}
var_dump($ChildClass::generate()); // object(ChildClass)[1]
ChildClass::generate()
只要我使用它就会返回ChildClass
的实例,因为我从不提供$className
参数。问题是我的IDE给了我关于parent::generate()
调用与记录的返回类型不匹配的警告:
我想通过向父方法添加文档来消除此警告。我能做到:
@return ParentClass | ChildClass
将这个添加到父方法有效,但这不实用,因为有十几个子类,将来可能会有更多。我尝试了以下两种方法:
@return static
@return $className
但这并未使警告消失。是否有PHPDoc批准的方式来表明将始终返回调用子类?或者 - 更准确地说 - 将返回类$className
类?如果没有,有没有办法即使只用我的IDE? (PhpStorm 2017.2
)
下面的@gogaz评论让我思考:如果PHPDoc @return
可能表示类似self | descendants
答案 0 :(得分:0)
我遇到过类似的东西(PHPStorm比PHP更肛门)。除非有某些原因你必须让它专门针对子类,否则我会这样做
class ParentClass {
/**
* @param string $className
* @return ParentClass
*/
public static function generate($className = __CLASS__){
if(!$className) return new self();
else return new $className();
}
}
请注意,您的ChildClass
仍然是ParentClass
答案 1 :(得分:0)
您可以记录父类方法,然后在子类方法上继承它。
class ParentClass
{
/**
* @param string $className
* @return ChildClass
*/
public static function generate($className = __CLASS__){
if(!$className) return new self();
else return new $className();
}
}
class ChildClass extends ParentClass
{
/**
* @inheritdoc
*/
public static function generate($className = __CLASS__) {
return parent::generate($className);
}
}
我希望这能解决你的问题。
<强> 更新 强>: 另一种方法是使用所有类将实现的接口,因此您可以期望您的generate方法将返回一些实现该接口的类。
/**
* ...
* @return MyCustomInterface
*/
如果这不能解决您的问题...那么,您可以将返回类型设置为&#34;混合&#34;,这将禁止警告,它不会说谎:)因为您的生成method可以返回你通过参数指定的任何类......
/**
* ...
* @return mixed
*/