Подтвердить что ты не робот

Как сделать копию объекта без ссылки?

Хорошо известно, что объекты PHP5 OOP по умолчанию передаются по ссылке. Если это по умолчанию, мне кажется, что нет способа по умолчанию для копирования без ссылки, как?

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"
// }

В этот момент я хотел бы, чтобы $x был оригинальным $obj, но, конечно, это не так. Есть ли простой способ сделать это или мне нужно что-то сделать как это

4b9b3361

Ответ 1

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

Поэтому он должен выглядеть следующим образом:

<?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)

Ответ 2

Чтобы сделать копию объекта, вам нужно использовать клонирование объектов.

Чтобы сделать это в вашем примере, сделайте следующее:

$x = clone $obj;

Обратите внимание, что объекты могут определять свое поведение clone с помощью __clone(), что может привести к неожиданному поведению, поэтому помните об этом.