20

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

例子:

我如何描述“回调”将获得一个“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);
})

或者如果它完全可能?

4

2 回答 2

18

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

在您的示例代码中,实际上没有理由假定您的changer()方法返回 a MyOtherCustomClass(),因为这完全取决于您稍后在changer()使用中编写闭包的方式。充其量,您会在用法的注释changer()指出 return 的这种特殊用法changer(),因为返回该特定类型对象MyOtherCustomClass的是用法的实现,而不是changer()实现本身。

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

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

于 2013-05-17T17:58:00.980 回答
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. 使用“Closure”后缀作为类名来澄清它。
于 2018-07-06T10:19:34.943 回答