PHP 的引用機制與靜態局部變量特性,是實現高性能單例註冊表、緩存容器等模式的核心基礎。本文通過官方手冊示例與實戰代碼,徹底講透這兩大特性的原理與應用。
若需讓函數返回變量的引用而非值拷貝,必須在函數聲明與賦值調用兩處同時使用 & 符號:
<?php
function &returnsReference() {
$someRef = 0;
return $someRef;
}
$newRef = &returnsReference(); // 相當於 $newRef = &$someRef
?>
此時 $newRef 與函數內部的 $someRef 指向同一記憶體地址,修改任一者將影響另一者。
結合「返回引用」與「靜態局部陣列」,可實現極簡的單例註冊容器:
<?php
class A {}
class B {}
function &getInstance($className) {
static $instances = []; // 靜態局部變量,跨調用保持
if (!isset($instances[$className])) {
$instances[$className] = new $className(); // 僅首次創建
}
return $instances[$className]; // 返回引用
}
// 客戶端調用
$a1 = &getInstance('A');
$a2 = &getInstance('A');
$b1 = &getInstance('B');
$b2 = &getInstance('B');
echo ($a1 === $a2) ? 'A 是同一實例' : 'A 不同';
echo "\n";
echo ($b1 === $b2) ? 'B 是同一實例' : 'B 不同';
?>
A 是同一實例 B 是同一實例
此模式廣泛應用於 Laravel 服務容器、Symfony DependencyInjection 等現代框架核心組件中。