2010-11-08 17 views
27

Varsayılan olarak PHP5 OOP objects are passed by reference'un belgelendiği iyi belgelenmiştir. Bu varsayılan olarak, bana referans ile kopyalamak için varsayılan bir yolu yoktur, nasıl görünüyor? Bu noktada Referans olmadan bir nesnenin kopyası nasıl oluşturulur?

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

Ben orijinal $obj olmak $x isterdik ancak tabii ki değil. Bunu yapmak ya da ben böyle okumalısınız Yani like this

cevap

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

bir şey kodlamak zorunda yapmak için herhangi bir basit bir yolu var mı:

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

Çok yardımcı oldu. lonesomeday, '__clone()' sihirli yöntemiyle ilgili çok iyi bir nokta yapar; bazı sınıflar da uygulanmaya değerdir, bu da dikkat çekicidir. – Treffynnon

21

bir nesnenin bir kopyasını yapmak için, object cloning kullanmak gerekir .

, sizin örnekte bunu yapmak için: Size beklenmeyen davranışlarla verebilir __clone() kullanarak kendi clone davranışlarını tanımlamak, böylece bu akılda olabilir nesnelerin

$x = clone $obj; 

Not.

+0

Teşekkür ederim. Orada ilginç bir bilgi var. – acm

İlgili konular