在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并使你的功能似乎没有参数(除非我做错了)。我根本不应该尝试使用这种语言功能吗?
答案 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
答案 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'=>...);