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+ 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告