PHP 函数参数

本文最后更新于:2024年3月18日 凌晨

PHP 函数参数

  • 通过在函数定义时的声明,函数可以有任意数目的参数,有两种不同的方式传递参数给函数,第一种也是较为普遍的一种是按值传递,另一种是按引用传递。

按值传递参数

  • 大多数情况是按值传递参数,参数可以是任意合法的表达式,计算表达式的值,并将结果的值赋给函数中适当的变量。

按引用传递参数

  • 按引用传递参数允许忽略普通的作用域规则,可让函数直接访问和操作参数变量,要按引用传递参数,参数必须是变量,要指明函数的特定参数是按引用传递的话,需要在参数列表中变量名前加一个&
  • 示例3-5再次访问了doubler()函数,注意和前面的示例有一些不同。

示例3-5:简化的doubler函数。

1
2
3
4
5
6
function doubler(&$value){
$value = $value << 1;
}
$a = 3;
doubler($a);
echo $a;
  • 因为该函数的参数$value是按引用传递的,所以$a的实际值不是值的拷贝,而是被函数修改过的,变量变成了其值的两倍。
  • 这个函数还有副作用:自从我们把变量$a按引用传递给doubler(),​$a的值就受函数支配,在这里,doubler()给它赋了一个新值。
  • 被声明为按引用传送的参数只能是一个变量,因此,如果我们在前面的示例中包含语句<?= doubler(7); ?>,就会引起错误,然而,你可以先给变量指定一个默认值,然后再将变量作为参数(和提供默认值给按值传送参数一样的方法)
  • 即使在函数不能对给定的值产生影响的情况下,你也可能会想按引用传递参数,按值传递时,PHP必须复制值,特别是对大型的字符串和对象来说,这将会是一个代价很大的操作,按引用传送则不需要复制值,对于性能提高很有好处。

默认参数

  • 有时函数可能需要接受特定的参数,例如,当调用函数取得一个站点的配置时,函数可能接受一个包含配置名称的参数,和使用一些特定关键字来指定相比,你可能更想返回所有的配置,而不提供任何参数,这样的工作需要用到默认参数。
  • 要指定默认参数,需要在函数声明中给参数赋值,赋给参数的默认值不能是复杂的表达式,而只能是常量。
1
2
3
function get_preferences($which_preference = "all"){
// 如果$which_preference是"all",则返回所有prefs;否则,取得特定首选项的请求。
}
  • 当你调用get_preference()时,可以选择提供参数,如果提供了参数,函数返回与你给定字符串匹配的某项配置,如果 没有提供参数的话,函数返回所有的配置。
  • 函数可能有任意个有默认值得参数,但是,它们必须列在所有没有默认值的参数后面,所以设计参数的顺序也非常重要。

可变参数

  • 函数可以有可变数量的参数,例如,在前一节get_preference()的示例中可以为任何数目的名字返回站点配置,而不只是一个,要声明一个函数有可变参数,需要完全省去参数。
1
2
3
function get_preference(){
// 一些代码。
}
  • PHP提供了3个函数用于检索在函数中所传递的参数:
    • func_get_args()返回一个提供给函数的所有参数的数组。
    • func_num_args()返回提供给函数的参数数目。
    • func_get_arg()返回一个来自参数的特定参数。
1
2
3
$array = func_get_args();
$count = func_num_args();
$value = func_get_arg()
  • 在示例3-6中,count_list()函数接受任意个参数,它循环遍历这些参数并返回所有值的总和,如果没有给定任何参数,则返回false

示例3-6:参数计数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function count_list()
{
$count = 0;
if (func_num_args() == 0) {
return false;
} else {
for ($i = 0; $i < func_num_args(); $i++) {
$count += func_get_arg($i);
}
return $count;
}
}

echo count_list(1, 4, 9);
  • 这些函数的结果不能作为一个参数直接给其他函数使用,要把这些函数的结果当作参数使用,必须首先把函数的结果值赋给一个变量,然后再使用这个变量,下面的表达式是不能工作的:
1
foo(func_num_args());
  • 应该是:
1
2
$count = func_num_args();
foo($count);

遗漏参数

  • 当你调用函数时,可以传递任意个参数给函数,当函数必需的任意一个参数没有被传递时,那么参数保持未传递状态,并且PHP会为每一个遗漏的参数都发出警告:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function take_two($a,$b){
if(isset($a)){ echo "a is set\n";}
if(isset($b)){ echo "b is set\n";}
}
echo "With two arguments:\n";
take_two(1,2);
echo "With one arguments:\n";
take_two(1);

With two arguments:
a is set
b is set
With one arguments:
Warning: Missing argument 2 for take_two() in /path/to/script.php on line 6
a is set

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!