前言
大多时候我们所定义的函数都是固定参数个数的函数,这样能够减少用户输入不确定而导致的未知错误,但是有一些场景需要传入的参数个数不定,或者有时候我们无法确定应该传入哪些值,传入多少个参数,特别是当参数非常多的时候不但代码冗长且可读性差,这时候可变个数参数的函数就派上用场了。接下来继续探索关于可变参数个数的函数
可变参数个数的函数
可变参数的函数格式如下:
mixed funName (string arg1[,sting ...])
在函数中使用三个点"..."来表示可变参数。
使用默认参数适合实参个数少于形参的情况,而可变参数列表则适合实参个数多于形参的情况。如果在函数中用不到多传入的参数则没有意义。通常,用户在定义函数时,设置的参数数量是有限的。如果希望函数可以接受任意数量的参数,则需要在函数中使用PHP系统提供的func_get_args()函数,它将所有传递给脚本函数的参数当作一个数组返回。还可以使用func_num_args()、 func_get_arg() 。但是这些方法不太建议使用,在PHP5.6以后可以可直接显式 在函数列表中使用“...”表示可变参数,包含 “...”的参数,会转换为指定参数变量的一个数组,后面我们再介绍此种方式。如下面代码所示:
<?php
function test(){
$args = func_get_args();
for($i=0;$i<count($args);$i++){
echo "参数".$i.":".$args[$i]."\n";
}
}
test("a","b","c","d",1,2,3,4,5);
?>
执行结果如下:
上面的例子中虽然没有声明参数列表,但是可以传入任意个数、任意类型的参数
除此之外,还可以使用func_num_args()函数返回参数的总数,使用func_get_arg()函数接收一个数字参数,返回指定的参数。上面的函数可以改写为如下代码:
<?php
function test(){
$args = func_num_args();
for($i=0;$i<$args;$i++){
echo "参数".$i.":" . func_get_arg($i) ."\n";
}
}
test("a","b","c","d",1,2,3,4,5);
?>
执行结果还是一样的:
上面的例子实现了相同的功能,都可以在函数中获取任意个数的参数列表,并在函数中使用。在PHP的系统函数中,也有很多这样的可变参数的函数,比如:array()、echo()、array_merge()等内置函数都是可以传递任意多个参数的。
直接在参数列表声明可变参数(推荐)
前面我们说过可以使用符号“...”在函数的参数列表中显式声明可变参数,语法如下:
function funName(...$var){}
接下来我们通过具体的例子来了详细了解它的用法:
<?php
function sum(...$args) {
$sum = 0;
foreach ($args as $arg) {
$sum += $arg;
}
return $sum;
}
echo sum(2, 3, 4, 8, 9);
?>
执行结果如下:
符号"..."的妙用
除了可以在声明函数的时候使用“...”符号声明可变个数的参数外,还是可以在调用函数的时候,通过“...”来传递覆盖多个参数
语法如下:
funcName(...array[,]);
我们通过实例来看看它的具体用法:
<?php
function sum($a, $b) {
return $a + $b;
}
echo sum(...[8, 6])."\n";
//两个结果是一样的
$a = [8, 6];
echo sum(...$a);
?>
执行结果如下:
从代码中可以看到,在调用函数的时候参数通过数组的方式传递,数组中的元素从第一个元素开始到最后一个元素和函数的形参一一对应。就算你把调用函数的代码修改成以下代码,即传入的数组中的元素比函数的形参个数多,也只是获取和形参对应的个数的元素进行计算,代码如下:
<?php
function sum($a, $b) {
return $a + $b;
}
echo sum(...[8, 6,5])."\n";
//两个结果是一样的
$a = [8, 6,5];
echo sum(...$a);
?>
结果如下: