變量前加 & 表示引用賦值,那麼函數宣告時前綴 & 代表什麼含義?本文通過實例深入解析函數引用返回機制。
$a = func():將函數返回值賦給變量,屬值傳遞$a = &func():將函數返回變量的記憶體地址綁定給變量,屬引用傳遞PHP 規定:只有透過 $a = &func() 方式調用,才能獲得函數的引用返回。
<?php
// 範例 1:字串拼接
function &chhua() {
static $b = "www.jb51.net";
$b = $b . "WEB開發";
echo $b . "<br>";
return $b;
}
$a = chhua(); // 輸出:www.jb51.netWEB開發
$a = "PHP";
$a = chhua(); // 輸出:www.jb51.netWEB開發WEB開發
$a = &chhua(); // 輸出:www.jb51.netWEB開發WEB開發WEB開發
$a = "JS";
$a = chhua(); // 輸出:JSWEB開發
// 範例 2:計數器
function &test() {
static $b = 0;
$b = $b + 1;
echo $b . "<br>";
return $b;
}
$a = test(); // 輸出:1
$a = 5;
$a = test(); // 輸出:2
$a = &test(); // 輸出:3
$a = 5;
$a = test(); // 輸出:6
?>
| 調用方式 | 輸出值 | 說明 |
|---|---|---|
$a = test() | 1, 2 | 普通調用,靜態變量正常遞增 |
$a = 5; $a = test() | 6 | 修改 $a 不影響靜態變量 $b |
$a = &test() | 3 | 建立引用綁定,$a 與 $b 指向同一記憶體 |
$a = 5; $a = test() | 6 | 修改 $a 同時改變 $b 為 5,下次調用從 6 開始 |
// 普通返回:值拷貝 $a = test(); // 等同於:$a = $b; (值複製) // 引用返回:地址綁定 $a = &test(); // 等同於:$a = &$b; (引用綁定) // 此後 $a 和 $b 共享同一記憶體地址 // 修改任一變量,另一個同步變化
注意:PHP 7+ 對引用機制有優化,但核心語義保持不變。現代開發中較少使用函數引用返回,傾向於物件導向模式管理共享狀態。