升級至 PHP 5.3 後,大量舊代碼出現 Deprecated: Assigning the return value of new by reference is deprecated 警告。典型錯誤代碼如下:
$mysql =& new mysql;
PHP 5 起,物件預設即為參考傳遞。PHP 5.3 正式棄用 =& 語法,PHP 7.0 更完全移除。舊代碼試圖「以參考方式指派 new 回傳值」在新版本屬於多餘且錯誤的操作。
| 舊寫法 | 新寫法 | 說明 |
|---|---|---|
$obj =& new Class(); | $obj = new Class(); | 直接指派,物件本身即參考 |
| 需複製物件 | $copy = clone $obj; | 使用 clone 關鍵字建立副本 |
| 複製時需修改屬性 | 實作 __clone() 魔術方法 | 在複製過程中自定義屬性處理邏輯 |
=& 對 new 無效:new 回傳的本身就是參考控制代碼,再加 & 屬於重複操作=& new 替換為 = new,並檢查是否有依賴「複製即複製參考」的邏輯需改用 clone<?php
// 錯誤寫法 (PHP 5.3+ Deprecated)
$db =& new Database();
// 正確寫法
$db = new Database();
// 若需獨立副本
$db2 = clone $db;
// 複製時自動重置連線
class Database {
public $connection;
public function __clone() {
$this->connection = null; // 強制重新連線
}
}
?>
=& new 模式function &factory() 回傳參考的舊式工廠模式call_user_func_array 等動態呼叫是否傳遞參考