Как сделать копию объекта без ссылки? - PullRequest
31 голосов
/ 08 ноября 2010

Хорошо задокументировано, что объекты 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, но, конечно, это не так.Есть ли простой способ сделать это, или я должен кодировать что-то , как это

Ответы [ 2 ]

49 голосов
/ 08 ноября 2010
<?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)
22 голосов
/ 08 ноября 2010

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

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

$x = clone $obj;

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

...