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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP