18

假设我有一个函数(显然是一个微不足道的例子):

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 中看起来像自动完成示例

但这对我来说就像是一个黑客,有没有办法只使用 docBlock 来做到这一点?

4

3 回答 3

16

[2015-01-08 更新]

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

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

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

但是,这不再受支持。从 PHP 5.6 开始,可变参数方法参数是 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
 **/
于 2014-06-20T22:42:45.257 回答
11

由于可变参数是在 PHP 5.6 中实现的,所以PHPDocumentor从2.4 版本开始应该支持以下语法。

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

这应该是描述这种签名的正确方式。这可能会包含在PSR-5中。一旦被接受,IDE 就应该支持这个“官方”建议。

但是,与此同时,一些 IDE 对他们认为正确的内容有了更好的理解。努力让 IDE 供应商支持从 5.6 开始支持的官方 PHP 语法,或者使用同时有效的任何东西。

于 2014-06-21T00:38:20.293 回答
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 中,由于不允许重载,因此如果要提供多种类型,约定是使用“混合”作为类型。

/**
*@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 文档,您可以使用

/**
*@param string ... list of strings
*/
于 2012-12-09T13:13:27.943 回答