PHPDoc中Closure的语法

时间:2013-05-16 14:17:51

标签: php closures phpdoc

我无法在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);
})

或者如果可能的话?

2 个答案:

答案 0 :(得分:15)

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

在您的示例代码中,实际上是一个假设您的changer()方法返回MyOtherCustomClass()的理由,因为这完全取决于您以后如何编写闭包在changer()用法中。最好的情况是,您在评论 中表示changer()使用此特定用途changer() 返回MyOtherCustomClass,因为正是该用法的实现,而不是changer()实现本身,返回该特定类型的对象。

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

如果我以这种方式实现某些东西,我会强加一个接口,callables必须全部显式返回,因此我可以写changer()返回该接口。当然,这意味着您的MyOtherCustomClass必须实现该界面,但在我看来,这似乎是接近{强制执行'changer()的返回类型的唯一方式。

答案 1 :(得分:0)

使用间接技术

您的代码:

   log4j:ERROR Could not instantiate class [org.apache.log4j.rolling.RollingFileAppender].
java.lang.ClassNotFoundException: org.apache.log4j.rolling.RollingFileAppender
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:171)
    at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
    at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:327)
    at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:124)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:785)
    ...
    ...
    ...
log4j:ERROR Could not instantiate appender named "LOG_CRON_SIJ".
log4j:ERROR Could not instantiate class [org.apache.log4j.rolling.RollingFileAppender].
java.lang.ClassNotFoundException: org.apache.log4j.rolling.RollingFileAppender
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:171)
    at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
    at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:327)
    at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:124)
    ....
    ....

log4j:WARN Failed to set property [triggeringPolicy] to value "org.apache.log4j.rolling.SizeBasedTriggeringPolicy". 
log4j:WARN Failed to set property [rollingPolicy] to value "org.apache.log4j.rolling.TimeBasedRollingPolicy". 
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'LOG_CRON_SIJ'    

,然后在某处提供伪代码:

/**
 * @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);
})

注意:

  1. 不需要__invoke的功能主体,因此将其留空。
  2. 使用“ Closure”后缀作为类名来澄清它。