2010-11-08 8 views
27

Jest dobrze udokumentowane, że PHP5 OOP objects are passed by reference domyślnie. Jeśli jest to domyślnie, wydaje mi się, że istnieje domyślny sposób kopiowania bez odniesienia, jak?Jak zrobić kopię obiektu bez odniesienia?

function refObj($object){ 
    foreach($object as &$o){ 
     $o = 'this will change to ' . $o; 
    } 

    return $object; 
} 

$obj = new StdClass; 
$obj->x = 'x'; 
$obj->y = 'y'; 

$x = $obj; 

print_r($x) 
// object(stdClass)#1 (3) { 
// ["x"]=> string(1) "x" 
// ["y"]=> string(1) "y" 
// } 

// $obj = refObj($obj); // no need to do this because 
refObj($obj); // $obj is passed by reference 

print_r($x) 
// object(stdClass)#1 (3) { 
// ["x"]=> string(1) "this will change to x" 
// ["y"]=> string(1) "this will change to y" 
// } 

W tym momencie chciałbym $x być oryginalny $obj, ale oczywiście nie jest. Czy jest jakiś prosty sposób to zrobić, czy muszę kodować coś like this

Odpowiedz

41
<?php 
$x = clone($obj); 

Więc należy go odczytać tak:

<?php 
function refObj($object){ 
    foreach($object as &$o){ 
     $o = 'this will change to ' . $o; 
    } 

    return $object; 
} 

$obj = new StdClass; 
$obj->x = 'x'; 
$obj->y = 'y'; 

$x = clone($obj); 

print_r($x) 

refObj($obj); // $obj is passed by reference 

print_r($x) 
+1

Cieszę się, że było pomocne. lonesomeday bardzo dobrze wskazuje na magiczną metodę '__clone() ', którą warto zaimplementować także niektóre klasy, na co warto zwrócić uwagę. – Treffynnon

21

Aby utworzyć kopię obiektu, trzeba użyć object cloning .

Aby to zrobić, w przykładzie, to zrobić:

$x = clone $obj; 

Należy pamiętać, że obiekty mogą definiować własne clone zachowanie używając __clone(), który może dać nieoczekiwane zachowanie, więc o tym pamiętać.

+0

Dziękuję. Masz tam interesujące informacje. – acm