gpt4 book ai didi

PHPDoc:记录始终产生自身或后代类的父类方法?

转载 作者:搜寻专家 更新时间:2023-10-31 21:49:32 25 4
gpt4 key购买 nike

考虑这段代码:

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() 调用与记录的返回类型不匹配:

enter image description here

我想通过向父方法添加文档来消除此警告。我可以这样做:

@return ParentClass | ChildClass

将它添加到父方法中是可行的,但这并不实际,因为有许多子类,而且将来可能会有更多。我已经尝试了以下两种方法:

@return static
@return $className

但这并没有使警告消失。是否有 PHPDoc 批准的方法来指示将始终返回调用子类?或者——更准确地说——将返回类型为$className 的类?如果没有,有没有一种方法可以只使用我的 IDE? (PhpStorm 2017.2)

更新

@gogaz 下面的评论让我想到:如果 PHPDoc @return 可以指示类似 self | 的东西就足够了后代

最佳答案

您可以记录父类方法,然后在子类方法上继承它。

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);
}
}

希望这能解决您的问题。

更新:另一种方法是使用所有类都将实现的接口(interface),因此您可以期望生成方法将返回某个实现该接口(interface)的类。

 /**
* ...
* @return MyCustomInterface
*/

如果这不能解决您的问题...那么,您可以将返回类型设置为“混合”,这将抑制警告并且不会说谎 :) 因为您的生成方法可以返回您通过参数指定的任何类...

 /**
* ...
* @return mixed
*/

关于PHPDoc:记录始终产生自身或后代类的父类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com