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" ) { }
当你调用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 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