PHP如何通过引用传递

首页 / 新闻资讯 / 正文

介绍

在PHP中函数的参数可以按值传递或按引用传递。默认情况下,实际参数的值按值传递给形式参数,形式参数成为函数内部的局部变量。因此,对这些变量的修改不会更改实际参数变量的值。

当实参通过引用传递时,形式实参的值更改会反映在实际实参变量中,因为前者是对后者的引用。因此,按引用传递机制有助于间接处理全局空间中的数据。它还有助于克服一个函数只能返回一个变量的事实。

值传递

在下面的示例中,两个变量被传递给swap()函数。即使交换机制发生在函数内部,它也不会更改已传递变量的值

示例

<?php function swap($arg1, $arg2){    echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n";    $temp=$arg1;    $arg1=$arg2;    $arg2=$temp;    echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n"; } $arg1=10; $arg2=20; echo "before calling function : arg1=$arg1 arg2=$arg2\n"; swap($arg1, $arg2); echo "after calling function : arg1=$arg1 arg2=$arg2\n"; ?>

输出结果

本示例给出以下输出

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\n";    $temp=$arg1;    $arg1=$arg2;    $arg2=$temp;    echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n"; } $arg1=10; $arg2=20; echo "before calling function : arg1=$arg1 arg2=$arg2\n"; swap($arg1, $arg2); echo "after calling function : arg1=$arg1 arg2=$arg2\n"; ?>

输出结果

交换结果如下所示

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的形式作为参数发送,这也是对第一个对象的引用

示例

<?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