錯誤現象
Fatal error: Call-time pass-by-reference has been removed in /path/file.php on line 10
原因
- PHP 5.4+ 完全移除「調用時傳引用」語法
- 舊代碼:
func(&$var) → 非法
- 正確:函數定義時聲明引用
function func(&$var),調用時 func($var)
代碼對比
| 錯誤寫法 (PHP ≤ 5.3) | 正確寫法 (PHP ≥ 5.4) |
getData(&$result); | function getData(&$result) { ... } getData($result); |
sort(&$arr); | sort($arr); // 內建函數已內部處理 |
快速排查與修復
- 全專案搜尋
&\$(正則 &\$\w+)
2. 確認對應函數定義是否已有 &,補齊定義端引用
3. 內建函數(sort、array_push 等)調用時絕不加 &
4. 執行測試套件驗證
其他 PHP 5.4+ 遷移高頻變更
| 變更 | 舊代碼 | 新代碼 |
| Safe Mode 移除 | ini_set('safe_mode',1) | 刪除,改用 open_basedir |
| register_globals 移除 | 依賴 $var 自動註冊 | 改用 $_GET/$_POST |
| magic_quotes 移除 | addslashes() 重複轉義 | 關閉 magic_quotes,手動過濾 |
短標簽 <? ?> 預設關閉 | <? echo $a; ?> | 改用 <?php echo $a; ?> 或開啟 short_open_tag |
Array 解構不再支援 {} | $a{0} | $a[0] |
遷移清單
- 啟用
error_reporting(E_ALL) + display_errors=On 開發環境
2. 運行現有測試套件,收集 Fatal/Deprecated
3. 批次修正 &$、短標簽、魔術引號殘留
4. 檢查第三方擴展相容性(PECL 更新或替換)
5. 壓測驗證效能與記憶體
總結
Call-time pass-by-reference 移除 是 PHP 5.4 遷移的標誌性錯誤。原則:「引用聲明在函數定義,調用時傳值」。配合自動化掃描(grep -rn '&\\\$' --include='*.php')可在數分鐘內清理全專案。