我无法在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);
})
或者如果可能的话?
答案 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);
})
注意: