前面我們已經知道,使用傳址引用的方式調用對象,實質調用的是同一個對象,有時需要建設立一個對象的副本,改變原來的對象時不希望影響到副本,在PHP中可以根據現在的對象來克隆出一個完全一樣的對象,克隆出來的副本和原本兩個對象完全獨立而互不干擾。
我們舉個簡單的例子來看一下複製的用法:
<?php header("content-type:text/html;charset=utf-8"); class Character{ //定义一个角色类 public $name; protected $location; function __construct($name , $location) //创建构造函数 { $this->name = $name; $this->location = $location; } function play(){ //创建方法 echo '我要玩' . $this->name.$this->location; } } $character1 = new Character('亚索','中单'); //实例化一个类 $character2 = clone $character1; //将实例化的类再克隆出来一个 $character1->play(); //调用方法执行 echo '<br/>'; $character2->play();
上述實例的結果都是『我要玩亞索中單』。
上面我們說到複製的複製和原本獨立而互不干擾,這句話又是什麼意思呢?
還是上面的實例,只是稍微發生點變動。
<?php header("content-type:text/html;charset=utf-8"); class Character{ //定义一个角色类 public $name; public $location; function __construct($name , $location) //创建构造函数 { $this->name = $name; $this->location = $location; } function play(){ //创建方法 echo '我要玩' . $this->name.$this->location; } } $character1 = new Character('亚索','中单'); //实例化一个类 $character2 = clone $character1; $character2->location = '上单'; $character1->play(); //调用方法执行 echo '<br/>'; $character2->play();
上述實例的結果就是‘我要玩亞索中單’和'我要玩亞索上單'。
由例子可以看出克隆出來的複製和原本兩個物件完全獨立而互不干擾。
__clone的用法
很多時候我們不單單要去複製一個對象,還想讓對象可以擁有自己的屬性和方法。那我們就要在類別中建立一個__clone方法。這個方法類似於建構子和析構函數,因為不會直接呼叫它。
還是以上面的實例為例:
<?php header("content-type:text/html;charset=utf-8"); class Character{ //定义一个角色类 public $name; public $location; function __construct($name , $location) //创建构造函数 { $this->name = $name; $this->location = $location; } function __clone(){ $this -> location = '上单'; } function play(){ //创建方法 echo '我要玩' . $this->name.$this->location; } } $character1 = new Character('亚索','中单'); //实例化一个类 $character2 = clone $character1; $character1->play(); //调用方法执行 echo '<br/>'; $character2->play();
__clone方法的一個很好的特性就是在使用預設行為創建一個副本之後能夠被調用,這樣,在這個階段,可以只改變希望改變的內容。
在__clone方法中新增的最常見功能就是確保作為引用進行處理的類別屬性能夠正確的複製。如果要複製一個包含物件引用的類,可能需要取得該物件的第二個副本,而不是該物件的第二個引用,因此這就是為什麼要在__clone方法中新增該程式碼的原因。
以上是php物件導向之物件克隆方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!