PHPDoc 中的闭包语法

2022-08-30 20:04:46

我在PHPDoc中找不到任何关于闭包类型的文档。所以我的问题是我如何定义发送到闭包的参数的参数及其返回值?

例:

我如何描述“回调”将获得“MyCustomClass”,一个数字和一个字符串,并返回一个“MyOtherCustomClass”?

/**
 * @param MyCustomClass $cls
 * @param Closure       $callback this isn't really explaining what this is
 *
 * @return MyOtherCustomClass
 */
function changer($cls, $callback){

  return $callback($cls, 2, "a string");
}

changer($aCustomeClass, function($cls, $int, $string){
   return new MyOtherCustomClass($cls, $int, $string);
})

或者如果可能的话?


答案 1

@param callable $callback确实是用于该部分的语法。您并没有将该参数限制为闭包本身...传递给它的任何可调用都将在该实现中被接受。Callable是合法的“PHP类型”,因此phpDocumentor接受它作为有效的类型。

在示例代码中,实际上没有理由假定您的方法返回 一个 ,因为这纯粹是由您稍后在用法中编写闭包的方式决定的。充其量,您可以在用法的注释中表示此特定用法的 changer() 返回 ,因为返回该特定类型的对象的是该用法的实现,而不是实现本身。changer()MyOtherCustomClass()changer()changer()MyOtherCustomClasschanger()

至于记录传递的可调用是“必需”接受的参数,我想你必须在param标签的描述段中这样做。没有语法来描述这种情况。

如果我以这种方式实现某些东西,我会强加一个可调用对象必须全部显式返回的接口,因此我可以编写返回该接口的接口。当然,这意味着您必须实现该接口,但是,在我看来,这似乎是接近“强制”来自 的返回类型的唯一方法。changer()MyOtherCustomClasschanger()


答案 2

使用间接技术

您的验证码:

/**
 * @param MyCustomClass  $cls
 * @param MyFancyClosure $callback
 *
 * @return MyOtherCustomClass
 */
function changer($cls, $callback){
    return $callback($cls, 2, "a string");
}

changer($aCustomeClass, function($cls, $int, $string){
   return new MyOtherCustomClass($cls, $int, $string);
})

而不是在某个地方提供虚拟代码:

/**
 * this is awesome closure!
 */
class MyFancyClosure {
    /**
     * @param MyCustomClass $cls
     * @param int           $int
     * @param string        $str
     *
     * @return MyOtherCustomClass
     */
    public function __invoke($cls, $int, $str) {}
}

注意:

  1. __invoke的函数体不是必需的,因此请将其留空。
  2. 使用“闭包”sufix作为类名来澄清它。

推荐