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
廣告