1.12 函数传值与引用
自定义函数是大多数编程语言都具备的特性,在PHP开发中则更具灵活性。
在PHP中,对函数参数个数没有限定,但是过多的参数会对调用和维护产生影响。下面我们一起讨论函数传值的两种形式。
1.12.1 传值
调用函数多采用值传递,告诉函数去完成什么任务。函数中接收参数,只需要在函数头的括号内加入相应的变量名。格式如下:
$user = getUserInfo($1, $2, $3)
那么在函数参数定义时,我们使用如下格式来接收值的传递。
function getUserInfo($first, $second, $third){ //etc }
当然我们也可以使用func_get_arg()函数来直接处理:
function getUserInfo(){ $first=func_get_arg(0); $second=func_get_arg(1); $third=func_get_arg(2); }
如果你觉得还是烦琐,还可以将func_get_arg()函数返回的内容交给数组,然后再进行处理:
function getUserInfo(){ $args=func_get_args(); $first=$args[0]; // 数组第一个元素索引是0 $second=$args[1]; $third=$args[2]; }
在PHP中使用值传递为变量赋值,比如当把一个变量的值分配给另一个变量时,其实是替代另一个变量的原值。变量相当于计算机存储器的一个代号,比如:
$a = $b;
这一行代码会把$b变量里的值替换为$a的值,之后也不影响变量$a,从优化存储数据角度来看,这并非最佳的方案。因此便有了引用的传值方法。
1.12.2 引用
在C或C++里,我们都知道有个“指针”的概念。它是一个指向内存地址的变量,这也是被称为指针的原因。C++的指针在内部,对于开发者来说不可见,它的特点是可直接访问到需要的内容,速度更快。
PHP的指针与这些语言机制相同,即可以用一个变量名称把工作地址与原始存储位置建立一个对应关系。如果我们在一个函数的参数前加入引用,这表示当函数对该内部变量的值进行修改时,同时也能够反映到函数外部,需要在对应的参数前加上“&”符号,如代码清单1-19所示:
代码清单1-19使用引用传递参数
function build_row(&$text){ $text = "<tr><td>$text</td></tr>"; } echo '<table border="1">'; $t = ’测试数据’; $row = &build_row($t); //引用方式调用函数 echo $t; echo $t; echo $t; echo '</table>';
这个脚本将打印一个3行的表格,函数的功能用来打印一行,如图1-3所示。
图1-3 通过函数来打印内容
使用引用的特征就是参数有“&”符号,它确定是否采用引用传递,这个符号的存在使得它能够“感受”到函数内部对它的变更,在函数调用完成时,针对这个变量的任何修改将同步跟进。所以按值和按引用的差别也就在这里。
注意,调用函数时也需要用&符号来声明是引用操作。