PHP变长参数?

时间:2011-01-02 15:14:49

标签: php function variadic-functions

在Python和其他人中,可变长度参数列表有特殊的语法:

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()等将它们作为数组传递。但是,我并没有真正理解第二部分所说的内容。 / p>

所以,我的问题是,是否有一些特殊的语法用于变长参数,或者一些我不了解的最佳实践?手册建议的方法充其量只是kludgey并使你的功能似乎没有参数(除非我做错了)。我根本不应该尝试使用这种语言功能吗?

6 个答案:

答案 0 :(得分:18)

这是一个更现实的例子:

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

这称为variadic function

答案 1 :(得分:10)

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

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

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()切片并相应地使用其不同的元素),但它确实使您的代码更加自我记录。

答案 2 :(得分:7)

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

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)
#> }

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

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

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);
}

PHP 7 以来,参数的变量列表也可以强制为同一类型的全部

function do_something($first, int ...$all_the_others) { /**/ }

答案 3 :(得分:2)

可变长度参数函数没有特殊的语法。

只需使用func_num_args()和func_get_args()函数来获取参数。

示例:

function callMe(){

    if(func_num_args() == 0){
        echo 'No arguments =)';
    }else{
        var_dump(func_get_args());
    }

}

答案 4 :(得分:1)

第二部分基本上是说一旦你开始使用变量参数函数,那么

function average() { ... }
function average(arg1, arg2, arg3) { ... }

工作相同,只是第二个版本有3个参数明确列出。这就是全部,不要试图阅读更多的手册页。

答案 5 :(得分:0)

我通常这样做是为了避免不断更改函数,并避免参数顺序错误

function any_function($ops=array())
{
}

$ops = array('name'=>1, 'type'=>'simplexml', 'callback'=>...);