首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 5.3+ 棄用「=& new」語法完整解決方案

     編輯:PHP 相關知識

錯誤現象與背景

升級至 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() 魔術方法在複製過程中自定義屬性處理邏輯

核心觀念釐清

  1. PHP 5 物件模型重大變革:物件不再像 PHP 4 那樣以值傳遞,而是透過「物件識別碼」參考同一實例
  2. =& 對 new 無效:new 回傳的本身就是參考控制代碼,再加 & 屬於重複操作
  3. 遷移策略:批次搜尋專案中所有 =& 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 等動態呼叫是否傳遞參考
  • 執行單元測試驗證物件行為一致性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved