PHP 允許函數返回變數引用而非值拷貝,需在宣告與呼叫處雙雙使用 & 符號:
<?php
function &returns_reference() {
$someref = 0;
return $someref;
}
$newref = &returns_reference(); // $newref 現在是 $someref 的別名
$newref = 10; // 修改會影響原變數(若在函數作用域內)
?>
應用場景:大型資料結構避免拷貝、鏈式操作、單例模式實作等。
函數內使用 static 宣告的變數,生命週期延長至腳本結束,但作用域仍限於函數內部:
function counter() {
static $count = 0; // 僅初始化一次
$count++;
echo $count . '<br>';
}
counter(); // 1
counter(); // 2
counter(); // 3
經典的單例工廠實作,利用靜態變數快取實例、返回引用避免拷貝:
<?php
class A {}
class B {}
function &factory($className) {
static $instances = []; // 區域靜態陣列,跨呼叫保持
if (!isset($instances[$className])) {
$instances[$className] = new $className(); // 延遲實例化
}
return $instances[$className]; // 返回引用
}
// 使用
$a1 = &factory('A');
$a2 = &factory('A');
$b1 = &factory('B');
$b2 = &factory('B');
echo ($a1 === $a2) ? 'A 為同一實例<br>' : '';
echo ($b1 === $b2) ? 'B 為同一實例<br>' : '';
echo ($a1 === $b1) ? 'A 與 B 相同' : 'A 與 B 不同'; // 不同
?>