Lý do sử dụng bản sao là PHP khi làm việc với đối tượng luôn trả về đối tượng dưới dạng tham chiếu chứ không phải dưới dạng bản sao.
Đó là lý do tại sao khi đi qua đối tượng để một chức năng bạn không cần phải xác định nó với & (tham khảo):
function doSomethingWithObject(MyObject $object) { // it is same as MyObject &object
...
}
Vì vậy, để có được đối tượng sao chép bạn phải sử dụng bản sao từ khóa Đây là một ví dụ về cách đối tượng được xử lý bởi php và bản sao nào:
class Obj {
public $obj;
public function __construct() {
$this->obj = new stdClass();
$this->obj->prop = 1; // set a public property
}
function getObj(){
return $this->obj; // it returns a reference
}
}
$obj = new Obj();
$a = $obj->obj; // get as public property (it is reference)
$b = $obj->getObj(); // get as return of method (it is also a reference)
$b->prop = 7;
var_dump($a === $b); // (boolean) true
var_dump($a->prop, $b->prop, $obj->obj->prop); // int(7), int(7), int(7)
// changing $b->prop didn't actually change other two object, since both $a and $b are just references to $obj->obj
$c = clone $a;
$c->prop = -3;
var_dump($a === $c); // (boolean) false
var_dump($a->prop, $c->prop, $obj->obj->prop); // int(7), int(-3), int(7)
// since $c is completely new copy of object $obj->obj and not a reference to it, changing prop value in $c does not affect $a, $b nor $obj->obj!
Nguồn
2012-08-30 11:12:24
[Mẫu thiết kế nguyên mẫu] (http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref = sr_1_1) cũng là một trường hợp sử dụng tốt. – pce