php自定义函数在函数间的三种传递方式
函数间参数传递的3种方式:按照值传递(正常传递),按引用传递和默认参数(可变参数传值)。
1.按值传递的方式(正常传递)
将实参的值赋值到对应的形参中,在函数内部的操作针对形参进行,操作的结果不会影响到实参,即函数返回后,实参的值不会改变。值传递(pass-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
首先定义一个函数 example(), 功能是将传入的参数值做一些运算后在输出;接着在函数外部定义一个变量$m,也就是实参;最后调用函数 example($m)。分别在函数体内和体外输出形参 $m和 实参 $m 的值。
其实例代码如下:
function example($m){ $m = $m + 10; echo "在函数内部:m = ".$m ."<br>"; //输出形参的值 } $m = 1; example($m); // 将实参$m的值传递给形参$m echo "在函数外部:m = ".$m; // 实参的值没有变化,$m =1
函数的运行结果如下:
在函数内部:m = 11 在函数外部:m = 1
2. 按引用传递方式
按引用传递就是将实参的内存地址传递给形参。这时,在函数内部所有对形参的操作都会影响到实参的值。函数返回后,实参的值会发生变化。引用传递方式就是函数定义时在形参前面加上“&” 符号。引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
代码示例如下:
//定义一个函数,同时传递参数$m的地址 function example(&$m){ $m = $m + 10; echo "在函数内部:m = ".$m ."<br>"; //输出形参的值 } $m = 1; example($m); // 将实参$m的地址传递给形参$m echo "在函数外部:m = ".$m; // 实参的值发生了变化,$m = 11
函数的运行结果如下:
在函数内部:m = 11 在函数外部:m = 11
3. 默认参数(可变参数传值)
还有一种设置参数的方式,即可选参数。可以指定某个参数为可选参数,将可选参数放在参数列表末尾,并且指定其默认值为空。
应用一个例子使用可选参数实现一个简单的价格计算功能。设置自定义函数 values 的参数 $tax 为可选参数,其默认值为空。 第一次调用该函数,并且给参数 $tax 赋值,输出价格;第二次调用该函数,不给参数复制,输出价格。
其代码如下:
function value($price, $tax=""){ //定义一个函数,第二个参数为空 $price = $price*$tax; echo "价格:$price<br>"; //输出价格 } value(10,5); // 为可选参数赋值5 value(10); // 没有给可选参数赋值11
输出结果为:
价格:50 价格:0
注意:当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错。