首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP可变长度参数?

PHP可变长度参数?
EN

Stack Overflow用户
提问于 2011-01-02 15:14:49
回答 6查看 10.6K关注 0票数 8

在Python和其他方面,变量长度参数列表有特殊的语法:

代码语言:javascript
复制
def do_something(*args):
    # do something

do_something(1, 2, 3, 4, 5, ...) # arbitrarily long list

我正在阅读PHP手册,它说:

PHP 4及以上版本支持用户定义函数中的可变长度参数列表.使用func_num_args()、func_get_arg()和func_get_args()函数非常容易。 不需要特殊的语法,参数列表仍然可以显式地提供函数定义,并且行为正常。

我知道第一部分了。您可以将任意多的参数传递给不带参数的函数,然后使用func_get_args()等将它们作为数组来获取。不过,我不太明白第二部分的意思。

所以,我的问题是,对于可变长度的参数,是否有一些特殊的语法,或者一些我不知道的最佳实践?手册中所建议的方法充其量似乎是一种传统的方法,它使您的函数看起来不需要任何参数(除非我做错了)。难道我根本不想使用这个语言特性吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-02 15:18:00

与Python的*运算符或C#的params关键字不同,在PHP中,您甚至不必指定可变长度的参数。第二部分开始时,“不需要特殊语法。”

至于第二段的其余部分:如果您想在变量长度参数之前指定任何必需的或不相关的参数,请在您的函数签名中指定它们,以便您的函数能够处理这些参数。然后,要获取变量长度参数,从func_get_args()中删除所需的变量,如下所示:

代码语言:javascript
复制
function func($required) {
    // Contains all arguments that come after $required
    // as they were present at call time
    $args = array_slice(func_get_args(), 1);
}

您不必这样做(您仍然可以从func_get_args()切片并相应地使用其不同的元素),但它确实使代码更自文档化。

票数 10
EN

Stack Overflow用户

发布于 2011-01-02 15:36:19

下面是一个更现实的例子:

代码语言:javascript
复制
function Average()
{
    $result = 0;
    $arguments = func_get_args();

    foreach ($arguments as $argument)
    {
        $result += $argument;
    }

    return ($result / max(1, func_num_args()));
}

Average(1, 2, 3, 4, 5); // 3

这叫做变分函数

票数 18
EN

Stack Overflow用户

发布于 2015-12-10 15:34:39

由于PHP5.6,可以使用...运算符指定变量参数列表。

代码语言:javascript
复制
function do_something($first, ...$all_the_others)
{
    var_dump($first);
    var_dump($all_the_others);
}

do_something('this goes in first', 2, 3, 4, 5);

#> string(18) "this goes in first"
#>
#> array(4) {
#>   [0]=>
#>   int(2)
#>   [1]=>
#>   int(3)
#>   [2]=>
#>   int(4)
#>   [3]=>
#>   int(5)
#> }

如您所见,...操作符收集数组中参数的变量列表。

如果需要将变量参数传递给另一个函数,...仍然可以帮助您。

代码语言:javascript
复制
function do_something($first, ...$all_the_others)
{
    do_something_else($first, ...$all_the_others);
    // Which is translated to:
    // do_something_else('this goes in first', 2, 3, 4, 5);
}

由于PHP7,参数的变量列表也可以强制为所有相同类型的

代码语言:javascript
复制
function do_something($first, int ...$all_the_others) { /**/ }
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4578975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档