在php中可以根據現在的對象克隆出一個完全一樣的對象,克隆出來的副本和原本兩個對象完全獨立而互不干擾。
對象復制可以通過 clone 關鍵字來完成(如果可能,這將調用對象的 __clone() 方法)。對象中的__clone() 方法不能被直接調用。
當復制完成時,如果定義了 __clone() 方法,則新創建的對象(復制生成的對象)中的 __clone() 方法會被調用,可用于修改屬性的值(如果有必要的話)。
當對象被復制后,PHP 5 會對對象的所有屬性執行一個淺復制(shallow copy)。所有的引用屬性 仍然會是一個指向原來的變量的引用。
$copy_of_object = clone $object;void__clone (void )對象復制:
class SubObject{ static $instances = 0; public $instance; public function __construct() { $this->instance = ++self::$instances; } }class MyCloneable{ public $object1; public $object2; public $name; /*function __clone() { // 強制復制一份this->object, 否則仍然指向同一個對象 $this->object1 = clone $this->object1; } */ }$obj = new MyCloneable();$obj->object1 = new SubObject();$obj->object2 = new SubObject();$obj->name='張三';$obj2 = clone $obj;$obj->object1->instance='123';$obj2->name='李四';var_dump($obj);var_dump($obj2);輸出結果為:
object(MyCloneable)[1] public 'object1' => object(SubObject)[2] public 'instance' => string '123' (length=3) public 'object2' => object(SubObject)[3] public 'instance' => int 2 public 'name' => string '張三' (length=6)object(MyCloneable)[4] public 'object1' => object(SubObject)[2] public 'instance' => string '123' (length=3) public 'object2' => object(SubObject)[3] public 'instance' => int 2 public 'name' => string '李四' (length=6)由此我們可以看到原對象的引用屬性改變會影響到克隆出來的對象的引用屬性,但原對象的普通屬性改變不會影響到克隆出來的對象的普通屬性。這就是淺復制的作用。如果我們想要使原來和復制出的對象引用屬性不相互干擾,我們可以將引用屬性再強制復制一遍
新聞熱點
疑難解答
圖片精選