Как объявить неограниченные параметры в DocBlock?

Скажем, у меня есть функция (очевидно, тривиальный пример):

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

Теперь я знаю, что могу изменить это, чтобы быть

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

но с некоторыми функциями, которые не являются опцией. Итак, как бы вы задокументировали первую версию функции с помощью docBlock, чтобы среда IDI могла интерпретировать ее возможность получать неограниченные параметры?

Я видел несколько методов, которые используют:

/**
 * 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?

Ответы

Ответ 1

[ОБНОВЛЕНО 2015-01-08]

Старый способ сделать это в PHPDoc:

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

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

Однако это больше не поддерживается. Начиная с PHP 5.6 Variadic Method Параметры являются частью языка PHP, и PHPDoc был обновлен, чтобы отразить это как PHPDoc 2.4, если я правильно помню. Это также в среде PhpStorm IDE с EAP 139.659 (должно быть в 8.0.2 и выше). Не уверены в реализации других IDE.

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

В любом случае правильный синтаксис для DocBlocks, идущий вперед для переменных параметров:

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

Ответ 2

Как Variadics реализованы в 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 для поддержки официального синтаксиса PHP, который поддерживается с 5,6 или использует все, что работает в то же время.

Ответ 3

В 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, вы можете объявить своего рода valist с

/**
*@param string ... list of strings
*/