按值传递参数
在编程中,参数传递分为按值传递和按引用传递两种方式。按值传递是指将实参的值复制一份进行传递,而不是传递实参本身的引用。这种方式又分为基本数据类型和复杂数据类型。
基本数据类型按值传递参数
基本数据类型包括整型、浮点型、布尔型、字符型等,这些数据类型都是占用较少内存空间,其值可以较为轻松地进行拷贝。因此,这些数据类型在进行参数传递时,都采用按值传递的方式,即将实参的值复制一份传递到目标函数中。
function add($a, $b){
return $a + $b;
}
$c = 1;
$d = 2;
echo add($c, $d); // 输出结果为: 3
在这个例子中,变量$c和$d分别赋值为1和2,我们调用函数add,将$c和$d作为参数传入,函数内部对他们进行加法运算并返回结果。由于这里的参数类型均为基本数据类型,因此按值传递参数不会出现什么问题。
复杂数据类型按值传递参数
复杂数据类型包括数组、对象等,这些数据类型的内存占用较大,它们的值并不容易进行复制。因此,如果函数参数是此类数据类型,则按值传递参数就有可能会产生问题。
$var1 = [
'name' => 'Sally',
'age' => 18
];
function updateName($varArray){
$varArray['name'] = 'Lucy';
}
updateName($var1);
var_dump($var1); // 输出结果为: array(2) { ["name"]=> string(5) "Sally" ["age"]=> int(18) }
在这个例子中,我们定义了一个数组$var1,其中包含了键值对'name'和'age',我们定义了一个函数updateName,将$var1作为参数传入。函数内部将$varArray这个变量重新赋值为['name' => 'Lucy'] (即只更新了名字),并且结束函数。我们在函数外部使用var_dump查看数组$var1的值,发现它的名字并没有被改变。
为什么会发生这种情况呢?因为在PHP中,数组和对象等因为其内存空间占用较大,因此按值传递参数时,实参复制一个新值作为参数传递,而不是传递实参本身的引用。因此,在函数内部对它所接收的参数进行修改时,只是修改了形参的值,并不会对实参造成影响。
那么,如何在函数内部更新数组或对象的值呢?PHP提供了一个引用传递的方式。我们将在后面内容中介绍。