2010-11-08 17 views
27

यह अच्छी तरह से प्रलेखित है कि PHP5 ओओपी objects are passed by reference डिफ़ॉल्ट रूप से। यदि यह डिफ़ॉल्ट रूप से है, तो ऐसा लगता है कि कोई संदर्भ के साथ प्रतिलिपि बनाने का कोई डिफ़ॉल्ट तरीका नहीं है, कैसे ??संदर्भ के बिना किसी वस्तु की एक प्रति कैसे बनाएं?

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 होने के लिए होगा, लेकिन निश्चित रूप से यह नहीं है। वहाँ ऐसा करने या मैं कुछ like this

उत्तर

41
<?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) 
+1

खुशी है कि यह सहायक था। lonesomeday '__clone()' जादू विधि के बारे में बहुत अच्छा बिंदु बनाता है कुछ वर्ग भी कार्यान्वित हो सकते हैं, जो ध्यान देने योग्य है। – Treffynnon

21

एक वस्तु की एक प्रतिलिपि बनाने के लिए, आप object cloning उपयोग करने की आवश्यकता ।

अपने उदाहरण में ऐसा करते हैं, ऐसा करने के लिए:

$x = clone $obj; 

नोट वस्तुओं कि __clone(), जो आप अनपेक्षित व्यवहार दे सकता है का उपयोग कर अपने स्वयं के clone व्यवहार परिभाषित कर सकते हैं, इसलिए इसे ध्यान में वहन करते हैं।

+0

धन्यवाद। आपके पास कुछ दिलचस्प जानकारी है। – acm

संबंधित मुद्दे