32

记录接受可变数量参数的类方法的推荐方法是什么?

也许是这样的?

<?php

class Foo {
    /**
     * Calculates the sum of all the arguments.
     *
     * @param mixed [$arg1, $arg2, ...]
     *
     * @return float the calculated sum
     */
    public static function sum() {
        return array_sum(func_get_args());
    }
}

注意:作为一般规则,我想应该尽可能避免这种类型的事情。话虽如此,最好仍然记录其余一些无法避免的情况。

4

4 回答 4

25

如果您使用可变数量的参数并且还使用,PHP >= 5.6那么您可以使用仍然符合,...已经提到的 PHPDoc 语法的可变参数函数(允许可变数量的参数),并且 PHPStorm 也将正确解释文档。使用可变参数函数无需func_get_args()将参数捕获到数组中。

/**
 * @param mixed $args,... Explainatorium!
 */
function variadiculous(...$args) {
    // NOTE: $args === func_get_args()
    foreach ( $args as $arg ) {
        /* do work */
    }
}

PHPStorm 将自动生成文档,@param array $args因为从技术上讲,当函数内部variadiculous is_array($args)为真时。我将其更改@param mixed $args,...为如上所示,当我使用热键在我的代码 PHPStorm 显示的其他位置显示函数签名时variadiculous($args : ...array|mixed)——如果您使用 PHP >= 5.6,我建议使用此方法

于 2016-07-08T22:03:27.167 回答
10
/**
 * @param mixed $numbers,... Description
 */
Public function sum ($numbers)

在该方法中,不会使用 $numbers。

于 2013-01-25T00:48:16.040 回答
10

...语法的情况下,PHPStorm 2017.1 使用:

/**
 * @param Type[] ...$values One or more values.
 */
public function func(Type ...$values) {
    // ...
}
于 2017-04-25T23:31:02.097 回答
3

值得注意的是,使用 doc 块,例如:

/**
 * @param Type[] ...$values One or more values.
 */
public function func(Type ...$values) {
    // ...
}

...看起来你可以传递一个数组Type,例如

Foo()->func([Type, Type, Type])

...这会引发致命错误,显然是现在。

在哪里:

Foo()->func(...[Type, Type, Type])

...不会因为您在方法调用中对其进行了解构。

无论如何,这里的重点是我正在试验 PHPStorm 如何处理 doc 块,并且取决于您$args在 doc 块中定位变量的方式,...$args或者$args,...确定您在 IDE 中返回的提示类型。

如果您有一个可选长度的函数/方法参数,我真的想要一种方法来建议您应该按名称将值传递到下面示例图像中的方法中,并具有它们应该传递的特定顺序。

您可能会想,“只需设置默认参数$arg1 = 'default', $arg2 = true”,这通常是有道理的,但在某些情况下

伪示例:

/**
 * @param int ...$args Hour, Minute, Second, Timezone, $arg [, ...$args]
 */
public static function createA(int ...$args) {}

/**
 * @param int $args,... Hour, Minute, Second, Timezone, $arg [, ...$args]
 */
public static function createB(int ...$args) {}

/**
 * @param int[]|int $args,... Hour, Minute, Second, Timezone, $arg [, ...$args]
 */

public static function createC(int ...$args) {}

在此处输入图像描述

...所以:

...是正确的答案(请记住 orientaton: ...$argsor $args,...

于 2018-12-16T17:38:10.383 回答