| 操作 | 語法 | 本質 | 對象狀態 |
|---|---|---|---|
| 賦值 | $b = $a; | 引用傳遞/指針指向同一內存 | 雙方修改屬性相互影響 |
| 複製 | $b = clone $a; | 調用 __clone() 魔術方法 | 新對象獨立,默認淺拷貝 |
注意:PHP 中 User a = b; 並非 C++ 風格的拷貝構造函數調用,而是引用賦值。PHP 5+ 使用 clone 關鍵字顯式複製對象。
class User {
public $name;
public $profile; // 對象屬性
public function __clone() {
// 強制深拷貝引用屬性
$this->profile = clone $this->profile;
}
}
$a = new User();
$a->profile = new Profile();
$b = clone $a; // 觸發 __clone,$b->profile 為新對象
PHP 無傳統拷貝構造函數,但以下場景涉及對象複製語義:
clone $obj。clone $obj。class User {
public $id;
public function __construct($id) { $this->id = $id; }
}
function getUser() {
$temp = new User(100);
return $temp; // 返回對象標識符
}
$user = getUser(); // $user 與 $temp 指向同一實例
$user->id = 200; // 修改影響原對象(若在函數作用域外無引用則無影響,但此處為同一實例)
clone 顯式複製,並在 __clone() 中處理深拷貝邏輯本文釐清了 PHP 對象複製機制與 C++ 拷貝構造函數的區別,幫助開發者避免引用共享導致的難以排查的 Bug。