PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数。也支持可变长度参数列表。
问题:
1、PHP参数传值和传引用的区别:
传值:在函数内部改变参数的值,它并不会改变函数外部的值。
传引用:函数可以修改函数外部的参数值。&表示这是一个传引用的参数,只是一个标志而已。
举例:
function add_some_extra(&$string) { $string .= 'and something extra.'; } $str = 'This is a string, '; add_some_extra($str); echo $str; // outputs 'This is a string, and something extra.'
2、如果有多个参数,有些带有默认参数,有些没有默认参数怎么办?
使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。这和C++的设计一致。
举例:
function makeyogurt($param2, $param1= "acidophilus")
3、如何限制参数类型?
类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误。
function test(boolean $param) {}
可是,弱类型语言PHP允许自动将integer类型的参数转换成string类型,这就不得不使用文件严格类型模式了。
在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError。
注意:这种严格模式仅限于标量参数,也就是严格模式只能在PHP7中使用。
<?php declare(strict_types=1); function sum(int $a, int $b) { return $a + $b; } var_dump(sum(1, 2)); var_dump(sum(1.5, 2.5)); ?>
4、如何定义可变长度参数列表,如何获取参数?
PHP5.5-:
func_num_args()可以计算参数个数。func_get_arg(arg_num),arg_num表示参数偏移量,从0开始计数。func_get_args()以数组形式获取参数列表。
PHP5.6+:
在PHP 5.6及更高版本中,参数列表可能包括“...”,以表示函数接受可变数量的参数。参数将作为数组传递到给定的变量中。
举例1(5.5):
function sum( $a, $b) { echo func_num_args();//2 echo func_get_arg(0);//1 dump (func_get_args());//[0=>1,1=>2] echo func_get_args()[0];//1 return $a + $b; } sum(1,2);
举例2(5.6):
function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4);
注:由于版本原因没有做检查