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

PHP 5 物件模型深度探索:Clone 物件複製機制與 __clone 魔術方法

     編輯:PHP 綜合知識

物件複製基本行為

PHP 5 使用 clone 關鍵字建立物件副本。預設行為為 淺拷貝:新物件擁有與原物件相同的屬性值(基本型別複製,資源/物件型別仍指向同一參考)。

自訂複製邏輯:__clone() 魔術方法

在類別中定義 __clone() 可控制複製過程:

  • 方法無參數,但內部可用 $this(新物件)與 $that(原物件,PHP 內部隱含)
  • 若定義 __clone(),PHP 不會自動複製任何屬性,必須手動從 $that 複製所需資料到 $this

實戰範例:自動編號追蹤器

<?php
class ObjectTracker {
    private static $nextSerial = 0;
    private $id;
    private $name;

    public function __construct($name) {
        $this->name = $name;
        $this->id = ++self::$nextSerial;
    }

    public function __clone() {
        // 複製時重新命名並分配新序號
        $this->name = "Clone of $this->name";
        $this->id = ++self::$nextSerial;
    }

    public function getId() { return $this->id; }
    public function getName() { return $this->name; }
}

$ot = new ObjectTracker("Zeev's Object");
$ot2 = clone $ot;

echo $ot->getId() . " " . $ot->getName() . "\n";   // 輸出: 1 Zeev's Object
echo $ot2->getId() . " " . $ot2->getName() . "\n"; // 輸出: 2 Clone of Zeev's Object
?>

進階應用場景

場景__clone 實作策略
資源管理(檔案句柄、DB 連線)複製時重新開啟資源,避免雙重關閉
巢狀物件結構遞迴 clone 子物件,實現深拷貝
單例模式防複製拋出例外或返回原實例
值物件不實作 __clone,依賴預設淺拷貝即可

常見誤區

  1. 以為 clone 會自動深拷貝:僅基本型別複製,陣列/物件屬性仍共享參考
  2. 忘記複製靜態屬性:靜態屬性屬於類別,不屬於實例,clone 不影響
  3. 在 __clone 中修改 $that:$that 僅供讀取,修改無效且不推薦

最佳實踐

  • 明確文件化類別的複製語意(可複製/不可複製/深拷貝)
  • 實作 __clone 時優先考慮不可變設計
  • 大型物件圖複製時考慮序列化/反序列化替代
  • 單元測試驗證複製後物件獨立性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved