PHP 按引用传递


简介

在 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

更新于:2020年9月18日

11K+ 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告