2012-08-30 25 views
5

thể trùng lặp:
what is Object Cloning in php?PHP từ khóa bản sao

Tôi đang nghiên cứu một khuôn khổ hiện có trong đó sử dụng một "bản sao" keyword rất nhiều, không chắc chắn cho dù đây là một ý tưởng tốt để làm điều này ? tôi không thực sự hiểu sự cần thiết phải sử dụng từ khóa 'clone'.

ví dụ có cái nhìn tại mã này

tức là

public function getStartDate() 
    { 
    return clone $this->startDate; 
    } 

với tôi chức năng này nên được như dưới đây, tôi không thấy sự cần thiết của bản sao.

public function getStartDate() 
    { 
    return $this->startDate; 
    } 
+0

[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

Trả lời

6

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! 
0

mặc dù nó được giải thích perfectley trong another question (nhờ chỉ @gerald này)

chỉ là một câu trả lời nhanh:

mà không có một bản sao hàm được trả lại một tham chiếu đến đối tượng STARTDATE. Với bản sao của nó trở về một bản sao.

nếu đối tượng được trả về sẽ bị thay đổi sau đó, nó chỉ thay đổi bản sao chứ không thay đổi bản gốc, cũng có thể được sử dụng ở một nơi khác.

+0

nhưng vấn đề là trong thiết kế hướng đối tượng đầy đủ, chúng ta cần đối tượng thực tế được truyền xung quanh không phải đối tượng nhân bản, không phải vậy sao?với tôi thiết kế này sử dụng các đối tượng nhân bản là không đúng trong một lớp khi thực hành thiết kế OO sử dụng .. – mahen3d

3

Có lẽ startDate là một đối tượng.

Sau đó. Khi bạn trả lại clone $this->startDate - bạn sẽ nhận được một bản sao đầy đủ của đối tượng. Bạn có thể chơi với nó, thay đổi giá trị, chức năng gọi. Và, cho đến khi chúng ảnh hưởng đến cơ sở dữ liệu hoặc hệ thống tập tin - nó an toàn và đối tượng thực tế startDate sẽ không bị sửa đổi.

Nhưng, nếu bạn chỉ trả về đối tượng như hiện tại - bạn chỉ trả lại tham chiếu. Và bất kỳ thao tác nào với đối tượng bạn làm - bạn thực hiện thao tác này với đối tượng gốc. Bất kỳ thay đổi nào bạn thực hiện - nó sẽ ảnh hưởng đến số startDate đó.

Điều này chỉ dành cho các đối tượng và không ảnh hưởng đến mảng, chuỗi và số vì chúng là các biến loại giá trị.

Bạn nên đọc thêm về biến loại giá trị và biến loại tham chiếu.

Các vấn đề liên quan