Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP可变长度参数?_Php_Function_Variadic Functions - Fatal编程技术网

PHP可变长度参数?

PHP可变长度参数?,php,function,variadic-functions,Php,Function,Variadic Functions,在Python和其他语言中,可变长度参数列表有特殊的语法: def do_something(*args): # do something do_something(1, 2, 3, 4, 5, ...) # arbitrarily long list 我正在阅读PHP手册,上面说: PHP4及以上版本支持 中的可变长度参数列表 用户定义的函数。这真是 非常简单,使用func_num_args(), func_get_arg()和func_get_args() 功能 不需要特殊语法,

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

def do_something(*args):
    # do something

do_something(1, 2, 3, 4, 5, ...) # arbitrarily long list
我正在阅读PHP手册,上面说:

PHP4及以上版本支持 中的可变长度参数列表 用户定义的函数。这真是 非常简单,使用func_num_args(), func_get_arg()和func_get_args() 功能

不需要特殊语法,并且 参数列表可能仍然是显式的 提供函数定义和 一切正常

我得到第一部分。您可以将任意多的参数传递给不带参数的函数,然后使用
func\u get\u args()
等将它们作为数组获取。不过,我不太明白第二部分的意思


所以,我的问题是,对于变长参数是否有一些特殊的语法,或者一些我不知道的最佳实践?手册中建议的方法充其量看起来很笨拙,使函数看起来好像不带任何参数(除非我做错了)。我应该不尝试使用这个语言功能吗?

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

至于第二段的其余部分:如果您想指定在可变长度参数之前的任何必需或不相关的参数,请在函数签名中指定它们,以便函数能够处理这些参数。然后,要获取可变长度参数,请从
func\u get\u 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\u get\u args()
中进行切片,并相应地使用其不同的元素),但它确实使您的代码更加自我记录。

对于变长参数函数没有特殊的语法

只需使用func_num_args()和func_get_args()函数即可获取参数

例如:

function callMe(){

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

}

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

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

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

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

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

这被称为。

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

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

工作方式相同,只是第二个版本中明确列出了3个参数。仅此而已,不要试图对手册页进行更多的阅读。

由于PHP5.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);
}

由于php7,参数的变量列表也可以强制为同一类型的all

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

我更想为可变长度参数命名,但谢谢,这是有用的信息。这是一个很酷的模式,但是
array\u slice(func\u get\u args(),1)
在PHP5.3中会抛出警告,在5.4中会抛出致命错误-修复方法是将
func\u get\u args()
括在括号中,如
array\u splice((func\u get\u args()),1)
@Shrapnel这是一种PHP哲学,不是吗?谁会关心其他人,我只会产生任何东西?PHP支持评论。够了。如果你想编码,就不要喋喋不休地谈论代码。如果用户传递了错误的参数,或者拼错了其中一个参数,那么你也就失去了引发错误的好处。优点和缺点。我不会说不正确,我更喜欢关联键,它应该更可读,而不是索引键。我只是讨厌将数组传递给函数。键入所有这些分隔符太长,因此自动完成将不知道参数(对于ide用户)