在多數情況下,我們並不需要完全複製一個物件來獲得其中屬性。但有一個情況下確實需要:如果你有一個 GTK 視窗物件,該物件持有視窗相關的資源。你可能會想複製一個新的視窗,保持所有屬性與原來的視窗相同,但必須是一個新的物件(因為如果不是新的物件,那麼一個視窗中的改變就會影響到另一個視窗)。
還有一種情況:如果物件 A 中儲存著物件 B 的參照,當你複製物件 A 時,你想其中使用的物件不再是物件 B 而是 B 的一個副本,那麼你必須得到物件 A 的一個副本。
作用:
物件複製可以通過 clone 關鍵字來完成(如果可能,這將呼叫物件的 __clone() 方法)。物件中的 __clone() 方法不能被直接呼叫。
語法:
$copy_of_object = clone $object;
注意:
當物件被複製後,PHP 5 會對物件的所有屬性執行一個淺複製(shallow copy)。所有的參照屬性 仍然會是一個指向原來的變數的參照。
當複製完成時,如果定義了 __clone() 方法,則新建立的物件(複製生成的物件)中的 __clone() 方法會被呼叫,可用於修改屬性的值(如果有必要的話)。
看程式碼:
<?php class Person { public $sex; public $name; public $age; public function __construct($name="", $age=25, $sex='男') { $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __clone() { echo __METHOD__."你正在克隆物件<br>"; } } $person = new Person('小明'); // 初始賦值 $person2 = clone $person; var_dump('persion1:'); var_dump($person); echo '<br>'; var_dump('persion2:'); var_dump($person2);
看結果:
Person::__clone你正在克隆物件 string(9) "persion1:" object(Person)#1 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小明" ["age"]=> int(25) } string(9) "persion2:" object(Person)#2 (3) { ["sex"]=> string(3) "男" ["name"]=> string(6) "小明" ["age"]=> int(25) }
克隆成功。
以上就是PHP中__clone()方法詳解的詳細內容,更多請關注TW511.COM其它相關文章!