PHP - 按引用传递



默认情况下,PHP 使用“按值传递”机制将参数传递给函数。如果函数内部的参数发生更改,则更改不会反映在函数外部。要允许函数修改其参数,必须使用“按引用传递”机制。

在 PHP 中,引用变量充当原始变量或宿主变量的“别名”,以便两者都可以读取和写入单个值。换句话说,两个不同名称的变量可以访问相同的值,并且它们的行为就像它们是同一个变量。

以下 PHP 脚本将有助于理解什么是引用。这里,$var 是一个普通的字符串变量。我们将 $var1 声明为 $var 的引用,在后者后面追加“&”符号。

$var = "Hello";
$var1 = &$var;

当我们说 $var1$var 的别名或引用时,这意味着对其值的任何更改也将更改 $var 的值,反之亦然。

示例

以下示例演示了“按引用传递”如何在 PHP 中工作 -

<?php  
   $var = "Hello";
   $var1 = &$var;

   $var1 = "Hello World";
   echo "var=$var var1=$var1" . PHP_EOL;

   $var = "How are you?";
   echo "var=$var var1=$var1" . PHP_EOL;
?>

它将产生以下输出 -

var=Hello World var1=Hello World
var=How are you? var1=How are you?

按引用调用 PHP 函数

要按引用调用函数,需要将形式参数的名称前缀为“&”符号。

function callref(&$arg1, &$arg2) {
   Statements;
}

对函数的调用与“按值传递”方法相同。

callref($x, $y);

当调用函数时,$arg1 成为 $x 的引用,$arg2 成为 $y 的引用。

如果在函数体内部,$arg1$arg2(或两者)的值发生更改,则也会导致 $x$y 的值发生更改。

示例

让我们看一下以下示例 -

<?php  
   function  change_name(&$nm) {
      echo "Initially the name is $nm" . PHP_EOL;
      $nm = $nm."_new";
      echo "This function changes the name to $nm" . PHP_EOL;
   }

   $name = "John";
   echo "My name is $name" . PHP_EOL;
   change_name($name);
   echo "My name now is $name" . PHP_EOL;
?>

变量 $name 被传递给函数 change_name()。引用变量 &$nm 成为其引用变量。$nm 的任何更改都会反映在函数外部的 $name 中。

它将产生以下输出 -

My name is John
Initially the name is John
This function changes the name to John_new
My name now is John_new

交换两个变量

在以下 PHP 代码中,我们通过按值传递参数来调用函数。该函数尝试交换它们的值。

在函数内部,它们的值已更改,但此交换在函数执行后不会反映在实际参数中。

当通过按引用传递参数调用同一个函数时,交换效果也会反映在实际参数中。

<?php  
   function  swap_value($a, $b) {
      echo "Initial values a = $a b = $b \n";
      $c = $a; $a = $b; $b = $c;
      echo "Swapped values a = $a b = $b \n";
   }

   $x = 10; $y =20;
   echo "Actual arguments x = $x y = $y \n\n";

   swap_value($x, $y);
   echo "Actual arguments do not change after the function: \n";
   echo "x = $x y = $y \n\n";

   function  swap_ref(&$a, &$b) {
      echo "Initial values a = $a b = $b \n";
      $c = $a; $a = $b; $b = $c;
      echo "Swapped values a = $a b = $b \n";
   }

   swap_ref($x, $y);
   echo "Actual arguments get changed after the function: \n";
   echo "x = $x y = $y";
?>

它将产生以下输出 -

Actual arguments x = 10 y = 20 

Initial values a = 10 b = 20 
Swapped values a = 20 b = 10 
Actual arguments do not change after the function: 
x = 10 y = 20 

Initial values a = 10 b = 20 
Swapped values a = 20 b = 10 
Actual arguments get changed after the function: 
x = 20 y = 10

按引用返回

就像 PHP 中的函数可以按引用接受参数一样,它也可以返回引用。要定义返回引用的函数,请在函数名称前加上“&”符号。

示例

以下代码显示了返回引用的函数示例。它返回 $x,它是 myfunction() 内部的一个局部静态变量。由于“&”符号位于其前面,因此 $a(存储返回值的变量)成为 &x 的引用。因此,$a 的任何更改也将更改 $x 的值。

<?php
   function &myfunction(){
      static $x=10;
      echo "x Inside function: $x \n";
      return $x;
   }

   $a=&myfunction(); 
   echo "Returned by Reference: $a \n";
   $a=$a+10; 
   $a=&myfunction();
?>

它将产生以下输出 -

x Inside function: 10 
Returned by Reference: 10 
x Inside function: 20
广告