如何在DocBlock中声明无限/可变参数?

时间:2012-12-09 12:38:49

标签: autocomplete ide documentation docblocks

假设我有一个功能(显然是一个简单的例子):

public function dot(){
    return implode('.', func_get_args());
}

现在我知道我可以将其修改为

public function dot(array $items){
    return implode('.', $array);
}

但有些功能不是一种选择。那么,您如何使用docBlock记录函数的第一个版本,以便IDE可以解释它可以接收无限制的参数?

我见过一些使用的方法:

/**
 * Joins one or more strings together with a . (dot)
 * @param string $string1
 * @param string $string2
 * @param string $_ [optional]
 * @return string
 */
public function dot($string1, $string2, $_ = null) {
    return implode('.', func_get_args());
}

IDE中的哪个看起来像autocomplete example

但这对我来说就像是一个黑客攻击,是不是只用docBlock来做到这一点?

3 个答案:

答案 0 :(得分:15)

[更新2015-01-08]

在PHPDoc中执行此操作的方法是:

http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.param.pkg.html

/**
 * @param int $param,...
 **/

但是,不再支持此功能。从PHP 5.6开始,Variadic方法参数是PHP语言的一部分,如果我没记错的话,PHPDoc已经更新以反映PHPDoc 2.4的这一点。这也是在EAP 139.659的PhpStorm IDE中(应该在8.0.2及更高版本中)。不确定其他IDE的实现。

https://youtrack.jetbrains.com/issue/WI-20157

在任何情况下,适用于可变参数的DocBlocks的正确语法是:

/**
 * @param int ...$param
 **/

答案 1 :(得分:11)

由于Variadics在PHP 5.6中实现,PHPDocumentor应支持version 2.4以下的语法。

/**
 * @param Type ...$value
 * Note: PHP 5.6+ syntax equal to func_get_args()
 */
public function abc(Type ...$value) {}

这应该是描述此类签名的正确方法。这将likely包含在PSR-5中。一旦接受,IDE应遵循以支持此“官方”建议。

然而,与此同时,某些IDE对改进对其认为正确的内容有所了解。在IDE供应商上努力支持从5.6开始支持的官方PHP语法,或者使用同时工作的任何语法。

答案 2 :(得分:2)

在php中,valist或“可选参数”列表的概念不存在。

$_变量将只包含,这里是您提供的第三个字符串。 允许数组或字符串的唯一方法是使用is_array()

测试第一个参数
public function dot($arg1){
   if(is_array($arg1)){
       return implode('.',$arg1);
   }
   else if $arg1 instanceof \Traversable){
       return implode('.',iterator_to_array($arg1));
   }
   else{
       return implode('.',func_get_args());
   }
}

现在您已经处理了所需的行为,您必须记录它。在php中,由于不允许重载,如果要提供多种类型,则约定是使用“mixed”作为类型。

/**
*@param mixed $arg1 an array, iterator that will be joined OR first string of the list
*@return string a string with all strings of the list joined with a point
*@example dot("1","2","3"); returns 1.2.3 dot(array(1,2,3)); returns 1.2.3
*/

此外,根据phpdocumentor documentation,你可以用

声明一种valist
/**
*@param string ... list of strings
*/