PHP 引用传递
phpserver side programmingprogramming更新于 2025/8/19 16:52:17
简介
在 PHP中,函数的参数可以按值传递或按引用传递。默认情况下,实际参数的值按值传递给形式参数,形式参数在函数内部成为局部变量。因此,修改这些变量不会改变实际参数的值。
当参数按引用传递时,形式参数值的改变会反映在实际参数变量中,因为前者是对后者的引用。因此,按引用传递机制有助于间接操作全局空间中的数据。它还有助于克服函数只能返回一个变量的问题。
按值传递
在下面的示例中,两个变量被传递给 swap() 函数。即使交换机制发生在函数内部,也不会改变传递的变量的值。
示例
<?php
function swap($arg1, $arg2){
echo "inside function before swapping: arg1=$arg1 arg2=$arg2
";
$temp=$arg1;
$arg1=$arg2;
$arg2=$temp;
echo "inside function after swapping: arg1=$arg1 arg2=$arg2
";
}
$arg1=10;
$arg2=20;
echo "before calling function : arg1=$arg1 arg2=$arg2
";
swap($arg1, $arg2);
echo "after calling function : arg1=$arg1 arg2=$arg2
";
?>
输出
此示例提供以下输出
before calling function : arg1=10 arg2=20 inside function before swapping: arg1=10 arg2=20 inside function after swapping: arg1=20 arg2=10 after calling function : arg1=10 arg2=20
通过引用传递
为了通过引用接收参数,形式参数所使用的变量必须以 & 符号为前缀。它引用用于调用函数的变量。因此,函数内部交换的结果也会反映在传递的原始变量中。
示例
<?php
function swap(&$arg1, &$arg2){
echo "inside function before swapping: arg1=$arg1 arg2=$arg2
";
$temp=$arg1;
$arg1=$arg2;
$arg2=$temp;
echo "inside function after swapping: arg1=$arg1 arg2=$arg2
";
}
$arg1=10;
$arg2=20;
echo "before calling function : arg1=$arg1 arg2=$arg2
";
swap($arg1, $arg2);
echo "after calling function : arg1=$arg1 arg2=$arg2
";
?>
输出
交换结果将显示如下
before calling function : arg1=10 arg2=20 inside function before swapping: arg1=10 arg2=20 inside function after swapping: arg1=20 arg2=10 after calling function : arg1=20 arg2=10
在以下示例中,数组元素是对数组初始化之前声明的各个变量的引用。如果修改元素,变量的值也会更改
示例
<?php $a = 10; $b = 20; $c=30; $arr = array(&$a, &$b, &$c); for ($i=0; $i<3; $i++) $arr[$i]++; echo "$a $b $c"; ?>
输出
$a、$b 和 $c 的值也会递增
11 21 31
也可以通过引用将数组传递给函数
示例
<?php
function arrfunction(&$arr){
for ($i=0;$i<5;$i++)
$arr[$i]=$arr[$i]+10;
}
$arr=[1,2,3,4,5];
arrfunction($arr);
foreach ($arr as $i)
echo $i . " ";
?>
输出
修改后的数组将显示如下
11 12 13 14 15
对象和引用
在 PHP 中,对象默认通过引用传递。创建对象的引用时,其引用也会以 $this 的形式作为参数发送,而 $this 也是对第一个对象的引用
示例
<?php
class test1{
private $name;
function getname(){
return $this->name;
}
function setname($name){
$this->name=$name;
}
}
$obj1=new test1();
$obj2=&$obj1;
$obj1->setname("Amar");
echo "name: " .$obj2->getname();
?>
输出
以上代码将显示以下输出
name: Amar

