使用引用執(zhí)行有三種基本操作: 引用賦值 、 傳引用 、 引用返回 。 本節(jié)介紹這些操作,并提供進一步閱讀的鏈接。
PHP 的引用允許用兩個變量來指向同一個內容。意思是,當這樣做時:
<?php
$a =& $b;
?>
注意:
$a 和 $b 在這里是完全相同的,這并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一個地方。
注意:
如果對一個未定義的變量進行引用賦值、引用參數(shù)傳遞或引用返回,則會自動創(chuàng)建該變量。
示例 #1 對未定義的變量使用引用
<?php
function foo(&$var) { }
foo($a); // 創(chuàng)建 $a 并賦值為 null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
同樣的語法可以用在返回引用的函數(shù)中:
<?php
$foo =& find_var($bar);
?>
在函數(shù)內使用相同的語法 不 通過引用返回將會產生錯誤, 就像將它與 new 運算符的結果一起使用一樣。 正如 對象和引用 中所述, 盡管對象是通過指針傳遞的,但是它們與引用不同。
如果在一個函數(shù)內部給一個聲明為 global
的變量賦于一個引用,該引用只在函數(shù)內部可見??梢酝ㄟ^使用
$GLOBALS 數(shù)組避免這一點。
示例 #2 在函數(shù)內引用全局變量
<?php
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // 僅在函數(shù)內部可見
} else {
$GLOBALS["var2"] =& $var1; // 全局上下文可見
}
}
global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
?>
global $var;
當成是 $var
=& $GLOBALS['var'];
的簡寫。從而將其它引用賦給
$var
只改變了本地變量的引用。
注意:
如果在 foreach 語句中給一個具有引用的變量賦值,被引用的對象也被改變。
示例 #3 引用與 foreach 語句
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// 做點什么
}
echo $ref; // 3 - 迭代數(shù)組的最后一個元素
?>
雖然不是嚴格意義上的引用賦值,但使用語言構造
array()
創(chuàng)建的表達式也可以通過在要添加的數(shù)組元素加上 &
前綴來表現(xiàn)為這樣。例如:
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>
但是請注意,數(shù)組內的引用具有潛在的危險。 在右側引用正常的賦值(不是通過引用)不會將左側變?yōu)橐茫? 但是數(shù)組內部的引用會保留在這些正常賦值中。 這也適用于調用函數(shù)時按值傳遞數(shù)組的情況。例如:
<?php
/* 標量變量賦值 */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c 不是引用;不會改變 $a 或者 $b
/* 數(shù)組變量賦值 */
$arr = array(1);
$a =& $arr[0]; //$a 和 $arr[0] 設置了相同的引用
$arr2 = $arr; //不是引用賦值!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* 盡量 $arr 不是引用,但是它的內容已經更改! */
?>
引用做的第二件事是用引用傳遞變量。這是通過在函數(shù)內建立一個本地變量并且該變量在呼叫范圍內引用了同一個內容來實現(xiàn)的。例如:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>
引用做的第三件事是引用返回。