2011-08-07 12 views
25
में क्लोन बनाम कॉपी

निम्नलिखित पर विचार करें:वस्तु पीएचपी

$object1 = new stdClass(); 
$object2 = $object1; 
$object3 = clone $object1; 

$object1->content = 'Ciao'; 

var_dump($object1); 
// Outputs object(stdClass)#1 (1) { ["content"]=> string(4) "Ciao" } 
var_dump($object2); 
// Outputs object(stdClass)#1 (1) { ["content"]=> string(4) "Ciao" } 
var_dump($object3); 
// Outputs object(stdClass)#2 (0) { } 

यह एक सामान्य पीएचपी व्यवहार है $object2 एक सामग्री $object1 के समान है?

मेरे लिए यह $object2 की तरह एक प्रतिलिपि के बजाय $object1 का संदर्भ है। सामग्री को बदलने से पहले ऑब्जेक्ट को क्लोन करना एक प्रति की तरह कार्य करता है। यह व्यवहार चर के साथ क्या होता है उससे अलग है और मुझे अनजान लगता है।

+1

का क्लोन सिर्फ एक और पीएचपी-WTF लापता चश्मा से उत्पन्न है यही कारण है कि। –

+0

यहां उदाहरण देखें: http://www.php.net/manual/en/language.oop5.references.php। –

+2

क्या आप थोड़ा सा विस्तार कर सकते हैं कि यह आपके लिए अनजान क्यों है? – hakre

उत्तर

38

हाँ, यह सामान्य है। ऑब्जेक्ट्स हमेशा PHP5 में संदर्भ द्वारा "असाइन किया गया" हैं। वास्तव में किसी ऑब्जेक्ट की प्रतिलिपि बनाने के लिए, आपको clone की आवश्यकता है।

हालांकि अधिक सही होने के लिए, मुझे बोली the manual करते हैं:

PHP5 के रूप में, एक वस्तु चर वस्तु ही मूल्य के रूप में अब और नहीं है। इसमें केवल एक ऑब्जेक्ट पहचानकर्ता होता है जो ऑब्जेक्ट एक्सेसर्स को वास्तविक ऑब्जेक्ट खोजने की अनुमति देता है। जब कोई ऑब्जेक्ट तर्क द्वारा भेजा जाता है, लौटाया जाता है या किसी अन्य चर को आवंटित किया जाता है, तो विभिन्न चर उपनाम नहीं होते हैं: वे पहचानकर्ता की एक प्रति धारण करते हैं, जो एक ही ऑब्जेक्ट को इंगित करता है।

4

php5 में ऑब्जेक्ट्स अनिवार्य रूप से पॉइंटर्स हैं, यानी, ऑब्जेक्ट वेरिएबल में कहीं और स्थित ऑब्जेक्ट डेटा का केवल एक पता होता है। एक असाइनमेंट $obj1 = $obj2 केवल इस पते की प्रतिलिपि बनाता है और डेटा को स्वयं स्पर्श नहीं करता है। यह वास्तव में counterintuitive दिखाई दे सकता है, लेकिन वास्तव में यह काफी व्यावहारिक है, क्योंकि आप शायद ही कभी वस्तु की दो प्रतियों की आवश्यकता है। मेरी इच्छा है कि PHP एरेज़ एक ही अर्थशास्त्र का उपयोग करें।

+0

'ArrayObject' – KingCrunch

+0

का उपयोग करें कुछ फ़ंक्शन केवल मूल सरणी स्वीकार करते हैं। '$ परिणाम = नया ArrayObject (array_map ($ cb, $ arrOb-> getArrayCopy());' – KingCrunch

13

यह सामान्य है और मैं इस unintuitive (वस्तु के लिए उदाहरण) पर विचार नहीं करेंगे:

$object1 = new stdClass(); 

$object1 करने के लिए एक नई वस्तु उदाहरण प्रदान करती है।

$object2 = $object1; 

$object2 को वस्तु दृष्टान्त प्रदान करती है।

$object3 = clone $object1; 

एक नई वस्तु उदाहरण किसी मौजूदा ऑब्जेक्ट उदाहरण से $object3 को क्लोन प्रदान करती है।

यदि ऐसा नहीं होता है, तो हर बार जब आपको एक ठोस वस्तु उदाहरण पारित करने की आवश्यकता होती है, तो आपको इसे संदर्भ द्वारा पारित करने की आवश्यकता होगी। यह कम से कम बोझिल है लेकिन PHP ने संस्करण 4 में ऐसा किया है (zend.ze1_compatibility_mode core की तुलना करें)। वह उपयोगी नहीं था।

Cloning allows the object to specify how it get's copied

+0

@stereofrog: ऑब्जेक्ट उन्मुख परिप्रेक्ष्य से, यह नहीं है। हालांकि, PHP * वास्तव में * एक प्रतिलिपि बनाता है, ऑब्जेक्ट पहचानकर्ता की एक प्रति। ऑब्जेक्ट मान केवल PHP 5 के बाद पहचानकर्ता द्वारा उपलब्ध है, इसलिए वास्तव में, "मैं एक प्रतिलिपि की अपेक्षा करता हूं" के साथ भी यह सहज है: आपको ऑब्जेक्ट आइडेंटिफ़ायर की प्रति प्राप्त होती है। हालांकि मुख्य बिंदु यह समझने के लिए हो सकता है कि ओओ को PHP में कैसे कार्यान्वित किया जाता है। – hakre

+0

@stereofrog: यह बहुत अधिक भ्रमित होगा, जब ऑब्जेक्ट्स कहीं भी पास हो जाने पर हर बार क्लोन करने जा रहे हैं। आप कभी भी एक कुत्ते को दो समान प्रतियों में विभाजित नहीं करेंगे, जब वह एक दरवाजा खड़ा करता है (और कुत्तों में से एक हमेशा बाहर रहता है ...)। दूसरी तरफ, जब मैं किसी को अपना फोन नंबर (एक मूल्य/आदिम प्रकार) देता हूं और वह इसे लिखता है, तो उसके पास केवल इसकी एक प्रति है, न कि संख्या। एक दूसरे के साथ आदिम प्रकारों और वस्तुओं के व्यवहार की तुलना करना उपयोगी नहीं है। – KingCrunch

+0

@stereofrog: * क्यों? * सही सवाल है। बेहतर कहने के लिए, ओपी को उसके बारे में थोड़ा और साझा करना चाहिए कि उसके लिए क्या अनजान है। अन्यथा जवाब देना मुश्किल है। इसके आगे, जहां तक ​​भाषा का संबंध है, यह असाइनमेंट और कॉपी (लिखने पर) के बीच भिन्न हो सकता है। इससे आँखें खुल सकती हैं कि भाषा कैसे काम करती है और समझने के लिए भाषा को एक उपकरण के रूप में उपयोग करने के बजाय समझने के लिए प्रोत्साहित करती है। – hakre

7

वस्तु प्रतिलिपि बनाम वस्तु क्लोन

class test{ 
public $name; 
public $addr; 
} 
// i create a object $ob 
$ob=new test(); 

// object copy 

$ob2=$ob; 

// in object copy both object will represent same memory address 
// example 
$ob->name='pankaj raghuwanshi'; 

// i am printing second object 
echo $ob2->name; 
// output is : pankaj raghuwanshi 

// another example 

$ob2->name='raghuwanshi pankaj'; 
echo $ob->name; 
// output is : raghuwanshi pankaj 

// it means in copy of object original and copy object share same memory place 

अब एक वस्तु

$ob1=clone $ob; 

echo $ob1->name; // output is : raghuwanshi pankaj 
echo $ob->name; // output is : raghuwanshi pankaj 

$ob1->name='PHP Clone'; 
$ob->name='PHP Obj'; 

echo $ob1->name; // output is : PHP Clone 
echo $ob->name; // output is : PHP Obj 

// on the base of these output we can say both object have their own memory space 
// both are independent 
+0

यह उत्तर लाइव उदाहरण के साथ उचित है – PankajR