Fatal error: Call-time pass-by-reference has been removed in /path/file.php on line 10
含義:在函數呼叫處使用 &$var 強制傳址已被移除(PHP 5.4+)。正確做法是在函數定義處宣告參數為引用。
| 錯誤寫法 (PHP 5.3 以前允許) | 正確寫法 (PHP 5.4+ 強制) |
|---|---|
foo(&$var); | function foo(&$var) { ... } |
array_push(&$arr, $val); | array_push($arr, $val); (內建函數已內部處理) |
sort(&$arr); | sort($arr); |
// 修改前
function addPrefix($str) {
$str = 'PREFIX_' . $str;
}
addPrefix(&$myVar); // Fatal error
// 修改後
function addPrefix(&$str) { // 參數定義加 &
$str = 'PREFIX_' . $str;
}
addPrefix($myVar); // 正常,呼叫端不需 &
; php.ini allow_call_time_pass_reference = On ; 重啟 PHP-FPM/Apache 生效
⚠️ 警告:此選項 PHP 5.4 已移除,PHP 8 完全不支援。僅作為緊急過渡,必須盡快改用策略一。
// 引用修改副作用大,改為純函數回傳新值
function addPrefix(string $str): string {
return 'PREFIX_' . $str;
}
$myVar = addPrefix($myVar); // 明確、可測試、無副作用
# 1. 掃描專案中所有呼叫端 & grep -rn "&\$\w+" --include="*.php" src/ # 2. 使用 Rector 自動重構 (需 composer require rector/rector --dev) # rector.php use Rector\Php54\Rector\FuncCall\RemoveCallTimePassByReferenceRector; $services->set(RemoveCallTimePassByReferenceRector::class); # 執行 vendor/bin/rector process src/ --dry-run # 預覽 vendor/bin/rector process src/ # 執行修復
sort()、array_push()、usort() 等內建函數參數在定義處已宣告引用,呼叫端絕不可加 &。&$var。&,並加註 /** @param Type $var 修改說明 */。php -l 語法檢查 + Rector 自動修復。