3.3 函数的重要元素——参数
参数
所谓参数是指在函数声明的圆括号内的变量或常量,通过参数可以向函数传递信息。通常情况下功能较复杂的函数都需要多个参数。
3.3.1 参数的声明方式
参数是一个用逗号作为分隔符的表达式列表,如果参数不存在则参数列表为空。在PHP中,声明参数时不需要指定该参数的数据类型,它可以自动识别变量类型,然后对该变量类型进行相应的操作。
比如,某函数可以计算两个数的最大公约数,那么声明参数时只需要在该函数圆括号内定义两个变量即可,代码如下:
代码3-5光盘\codes\第3章\3.3\parameter.php
<?php function divisor($m,$n){ if($m%$n==0){ return $n; }else{ return divisor($n,$m%$n); } } $a=6; $b=9; $result = divisor(6,9); echo $a."和".$b."的最大公约数为:".$result; ?>
该程序被执行时,运行结果如图3-5所示。
图3-5 参数的声明方式
3.3.2 参数的默认值
PHP中允许函数将参数定义成C++风格的默认值,也就是说允许实参与形参个数不同,实现的方法是在形参列表中对一个或几个形参指定默认值,该默认值必须为常量表达式。默认参数必须放在非默认参数的右侧,否则可能会得到与预期不同的执行结果。
比如,在程序中参数b含有默认值,而参数a和参数c没有默认值,代码如下:
代码3-6光盘\codes\第3章\3.3\default.php
<?php function printVar($a,$b=10,$c){ echo "a=$a b=$b c=$c"; } $a=1; $c=3; echo printVar($a,$c); ?>
运行上述代码时会得到错误信息。如果将默认参数b放在参数c的右侧,重新编译执行该程序,就可以得到预期的结果,如图3-6所示。
图3-6 参数的默认值
Note
PHP中不但可以使用数值类型作为默认参数,而且还允许使用数组和特殊类型NULL作为默认参数。
3.3.3 参数的两种传递方式——值传递和引用传递
在PHP中参数有两种传递方式,分别是值传递和引用传递。值传递是将要传递的值作为一个副本进行传递;而引用传递则是传递引用对象的内存地址。下面将分别介绍这两种参数传递方式的具体应用。
1.值传递
值传递是参数在调用函数前后不发生改变,传递给函数的只是这个参数的值。也就是说在传递参数时函数范围内对这些值的任何改变都在函数外部被忽略掉。PHP中除对象类型外,其他类型的参数传递方式都是值传递。
下面是一个使用值传递方式来增加变量值的例子,其代码如下:
代码3-7光盘\codes\第3章\3.3\value.php
<?php function change($number) { $number=$number+1; //使变量$number的值增加1 echo"函数内部\$number的值为:".$number."<br>"; //显示函数内部变量$number的值 } $number=10; change($number); //调用change()函数 echo"函数外部\$number的值为:".$number; //显示函数外部变量$number的值 ?>
该程序被执行时,运行结果如图3-7所示。
图3-7 参数的值传递
2.引用传递
如果我们希望在函数内部修改参数值,且函数的外部也能同时改变该参数值,可以使用引用传递。引用传递参数的方式为在参数前面添加“&”符号。
在引用传递方式中,当参数传递给函数时,函数不会再创建一个新变量,而是直接获得一个原有变量的引用。我们可以像使用其他变量一样使用该引用变量,其区别在于不是获得变量本身的值,而是指向原来的值。任何对该引用的修改都会影响到原始变量值。
下面是一个通过引用传递来增加变量值的例子,其代码如下:
代码3-8光盘\codes\第3章\3.3\quote.php
<?php function change($number){ $number=$number+1; //使变量$number的值增加1 echo"在函数内部\$number的值为:".$number."<br>"; //显示函数内部变量$number的值 } $number=10; change(&$number); //调用change()函数 echo"在函数外部\$number的值为:".$number; //显示函数外部变量$number的值 ?>
该程序被执行时,运行结果如图3-8所示。
图3-8 参数的引用传递